新闻中心

C# 如何使用泛型方法和泛型类_C# 泛型方法与泛型类使用教程

2025-11-02
浏览次数:
返回列表
泛型方法和泛型类可提升代码复用与类型安全,如定义PrintValue(T value)自动推断类型,Swap实现值交换,SimpleStack支持多类型栈操作,通过where约束限定类型条件,Pair类关联不同数据类型,避免装箱拆箱,增强性能。

c# 如何使用泛型方法和泛型类_c# 泛型方法与泛型类使用教程

泛型是 C# 中非常强大的特性,它允许我们编写可重用、类型安全的代码。通过使用泛型方法和泛型类,可以在不指定具体类型的情况下定义算法或数据结构,从而提高代码的灵活性和性能。本文将介绍如何在 C# 中使用泛型方法与泛型类,并提供实用示例。

泛型方法的使用

泛型方法是指在其定义中包含类型参数的方法。类型参数用尖括号 T 表示,运行时由实际传入的类型自动推断。

定义一个简单的泛型方法:

public static void PrintValue(T value)
{
   Console.WriteLine($"Value: {value}, Type: {typeof(T)}");
}

调用该方法时无需显式指定类型,编译器会根据传入参数自动推断:

PrintValue(100); // 输出: Value: 100, Type: System.Int32
PrintValue("Hello"); // 输出: Value: Hello, Type: System.String

也可以手动指定类型:

PrintValue(42);

泛型方法常用于工具类中,例如交换两个变量的值:

public static void Swap(ref T a, ref T b)
{
   T temp = a;
   a = b;
   b = temp;
}

调用方式:

int x = 10, y = 20;
Swap(ref x, ref y);
Console.WriteLine($"{x}, {y}"); // 输出: 20, 10

泛型类的定义与使用

泛型类允许类的操作针对多种类型保持一致。最常见的例子是集合类,如 ListDictionary 等。

自定义一个简单的泛型栈类:

public class SimpleStack
{
   private List items = new List();

   public void Push(T item)
   {
      items.Add(item);
   }

   public T Pop()
   {
      if (items.Count == 0)
         throw new InvalidOperationException("Stack is empty.");
      T item = items[items.Count - 1];
      items.RemoveAt(items.Count - 1);
      return item;
   }

   public int Count => items.Count;
}

使用这个泛型栈:

var stringStack = new SimpleStack();
stringStack.Push("First");
stringStack.Push("Second");
Console.WriteLine(stringStack.Pop()); // 输出: Second



易语言学习手册 十天学会易语言图解教程  pdf版 易语言学习手册 十天学会易语言图解教程 pdf版

十天学会易语言图解教程用图解的方式对易语言的使用方法和操作技巧作了生动、系统的讲解。需要的朋友们可以下载看看吧!全书分十章,分十天讲完。 第一章是介绍易语言的安装,以及运行后的界面。同时介绍一个非常简单的小程序,以帮助用户入门学习。最后介绍编程的输入方法,以及一些初学者会遇到的常见问题。第二章将接触一些具体的问题,如怎样编写一个1+2等于几的程序,并了解变量的概念,变量的有效范围,数据类型等知识。其后,您将跟着本书,编写一个自己的MP3播放器,认识窗口、按钮、编辑框三个常用组件。以认识命令及事件子程序。第

易语言学习手册 十天学会易语言图解教程  pdf版 3 查看详情 易语言学习手册 十天学会易语言图解教程  pdf版

var intStack = new SimpleStack();
intStack.Push(1);
intStack.Push(2);
Console.WriteLine(intStack.Pop()); // 输出: 2

泛型类的好处在于:一次定义,多类型复用,且避免了装箱拆箱带来的性能损耗。

约束泛型类型

有时我们需要对泛型参数做限制,比如要求它必须实现某个接口或具有无参构造函数。这时可以使用 泛型约束(where 关键字)。

常见约束包括:

  • where T : class —— 必须是引用类型
  • where T : struct —— 必须是值类型
  • where T : IComparable —— 必须实现指定接口
  • where T : new() —— 必须有无参构造函数
  • where T : MyBaseClass —— 必须继承自某个类

示例:只允许引用类型并具备无参构造函数:

public class ServiceFactory where T : class, new()
{
   public T CreateInstance()
   {
      return new T();
   }
}

这样就能确保 new T() 是合法操作。

多个泛型参数的使用

泛型支持多个类型参数,适用于键值对、映射等场景。

例如定义一个简单的键值容器:

public class Pair
{
   public TFirst First { get; set; }
   public TSecond Second { get; set; }

   public Pair(TFirst first, TSecond second)
   {
      First = first;
      Second = second;
   }
}

使用方式:

var pair = new Pair("Age", 25);
Console.WriteLine($"{pair.First}: {pair.Second}"); // 输出: Age: 25

这种设计在需要关联不同类型数据时非常有用。

基本上就这些。掌握泛型方法和泛型类的使用,能让你写出更高效、更安全的 C# 代码。关键是理解类型参数的作用以及如何通过约束控制可用操作。实际开发中多结合集合、工厂模式、服务注册等场景练习,自然就能熟练运用。

以上就是C# 如何使用泛型方法和泛型类_C# 泛型方法与泛型类使用教程的详细内容,更多请关注其它相关文章!


# 就能  # 洗发水的营销及推广方案  # 推荐聊城网站建设  # 平江营销型网站建设电话  # 营销推广宣传方法有哪些  # 江门seo优化建议  # 旅游网站sem推广方案  # 梧州营销推广团队有哪些  # 临邑大型用户网站建设  # 重庆抖音seo排名  # 南头高端网站推广  # 中非  # 复用  # 多个  # 泛型  # 如何使用  # 数据结构  # 键值  # 遍历  # 十天  # 易语言  # 键值对  # 代码复用  # ai  #   # 工具  # c# 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 在哪找SublimeJ远程工具_SFTP插件配置教程  如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率  C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程  C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用  抖音创作助手登录入口_抖音创作辅助工具官网直达  曝R星经典之作开发图 设计简陋但信息密集!  Excel Power Pivot如何处理XML数据源 构建高级数据模型  mc.js免安装版 mc.js一键畅玩入口  Golang如何通过reflect操作map_Golang reflect map操作与遍历技巧  c++ 获取系统当前时间 c++时间戳获取方法  荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程  如何在J*a中使用Locale处理多语言环境  C++如何进行游戏物理模拟_使用Box2D库为C++游戏添加2D物理效果  Golang如何安装Swagger工具_GoSwagger文档生成环境  wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法  QQ邮箱在线登录平台 QQ邮箱个人邮箱网页版入口  钉钉视频会议声音异常如何处理 钉钉会议音频修复技巧  Python多版本共存与虚拟环境管理深度指南  Win11怎么修改默认浏览器_Windows 11设置Chrome为默认  如何使用J*aScript精确选择并批量修改特定父元素下子链接的样式  一加 14R 快充无反应_一加 14R 充电优化  yandex入口引擎手机版 yandex安卓版下载入口  深入理解与实现最大堆的Heapify过程:常见错误与修正  限制HTML日期输入框的日期选择范围  QQ邮箱稳定登录入口_QQ邮箱官方网站网页版使用  抖音网页版快捷访问 抖音网页版网页版入口操作教程  小米汽车11月交付量突破40000台!雷军:将继续努力  狙击外星人小游戏开始_狙击外星人小游戏立即开始  word邮件合并后日期格式不对怎么改_Word邮件合并日期格式修改方法  美团外卖商家服务中心入口 美团商家版官网入口  火锅吃太多会怎样 火锅吃太多会上火吗  蓝湖怎样用切图标注提对接效率_蓝湖用切图标注提对接效率【设计对接】  LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理  铁路12306的积分有效期是多久_铁路12306积分有效期说明  J*aScript中在Map循环中检测并处理空数组元素  C++如何使用AddressSanitizer(ASan)_C++调试工具中检测内存访问错误的利器  AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看  汽水音乐在线解析 汽水音乐在线解析入口  UC浏览器网页版登录入口官网 电脑版网址入口  Tabulator表格日期时间排序问题及自定义解决方案  mcjs网页版流畅运行 mcjs低配电脑畅玩入口  Fabric Mod开发:在1.19.3+版本中正确添加自定义物品并管理物品组  必由学官网快捷入口 必由学网页版在线学习平台  J*aScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程  Mac怎么查看崩溃日志_Mac控制台错误报告分析  c++ 命名空间怎么用 c++ namespace使用指南  谷歌浏览器如何快速清除某个网站的数据_Chrome网站缓存清理方法  J*aScript打印功能_j*ascript输出控制  邮政快递单号查询入口 邮政快递物流信息在线查询入口  迅雷下载到U盘速度很慢怎么办_迅雷U盘下载慢优化方法 

搜索