当前位置: 首页 > news >正文

C#泛型

泛型是一种非常强大的特性,它允许程序员编写灵活的代码,同时保持类型安全。泛型的核心思想是允许类或方法在定义时不指定具体的数据类型,而是在实际使用时指定。这意味着你可以创建一个可以与任何数据类型一起工作的类或方法 

泛型类通过在类名后面添加尖括号(<T>)来定义,其中T是一个类型参数,代表将来可以被任何类型替换的占位符


  泛型;广泛的类型一般用于传递类型的,
  泛型的命名规范:以T开头的单词命名,

  <>中间类型就是传入泛型 <string> 字符串泛型
  <int> 整形的泛型
  <T>泛型类型

列子:

  //泛型使用在方法定义上.//调用泛型方法 通过<>将类型的实参进行传递,对应位置泛型形参就是这个类型Test<int>(1);//T 传递的是int 此次参数必须是int类型Test<string>("中国");//T 传递的是int 此次参数必须是string类型Test<bool>(true);//T 传递的是int 此次参数必须是bool类型
   //2调用带两个泛型参数方法Test1 传递的类型是一个Test1<int>(10, new int[] { 100});
 //3调用Test2方法 传递泛型了许 参数个数是2个Test2<int, string>(100, "中国");Test2<int, int>(100, 1000);

  Test2("中国","中国"); 泛型方法调用时候简化方法 系统自动推断类型

 重点:泛型方法调用的时候 由传入的类型决定着实参的类型 实参类型决定着形参的类型 所以泛型作用就进而体现了 参数类型不固定
 由方法调用来决定着

  //4 封装一个有返回值泛型数组 前面是内容 后面是几次;’ int[] aa= Test3<int>(6, 8);string[] ab= Test3<string>("中国", 10);Console.WriteLine(string.Join(",",aa));Console.WriteLine(string.Join(",", ab));

   泛型方法 可以传入整型的数字 也可以传入字符串 也可以数组 传入一个泛型就行
   定义方式 方法名字添加<T>方法参数类型改为T泛型的优势

   public static void Test<T>(T a){Console.WriteLine(a);}
 //2定义带两个泛型参数的方法//泛型数组: 数组可以传递整型数组 也可以字符串数组:T[] bpublic static void Test1<T>(T a ,T[] b){Console.WriteLine(a + "" + b[0]);}
  //3定义泛型方法 传递两个泛型参数 两个参数类型不一样 可以使用T a 一会可以T1  T2  T3public static void Test2<T,T1>(T a,T1 b){Console.WriteLine(a+""+b);}

 

  //4 public static T[] Test3<T>(T a,int count){T[] r = new T[count];//长度为第二个参数for(int i = 0; i < count; i++){r[i]= a;//所有的元素都是a }return r;}

运行结果: 

泛型的使用带来了多个好处:

  • 代码重用:你可以编写一次代码,然后用不同的数据类型重用它,而不需要重写代码。

  • 类型安全:泛型提供了编译时类型检查,这意味着你可以在编译时捕获类型错误,而不是在运行时。

  • 性能提升:泛型减少了需要进行类型转换的地方,这可以提高代码的性能。

泛型的使用场景

泛型在C#中的应用非常广泛,例如:

  • 泛型集合:.NET框架提供了许多泛型集合类,如List<T>Dictionary<TKey, TValue>等。

  • 泛型接口:你可以创建泛型接口,如IComparable<T>

  • 泛型委托:泛型也可以用于委托,例如Func<T, TResult>Action<T>

泛型约束

泛型约束允许你指定类型参数必须满足的条件。例如,你可以要求类型参数必须实现某个接口或继承自某个类。这提供了更多的控制,确保泛型类或方法可以安全地使用类型参数。

结论

泛型是C#中一个非常强大的特性,它提供了代码重用、类型安全和性能优化的好处。通过使用泛型,你可以编写出更加灵活和强大的代码,同时减少错误和提高效率。

http://www.lryc.cn/news/500874.html

相关文章:

  • go语言的成神之路-标准库篇-fmt标准库
  • React Native的router解析
  • Linux update-alternatives 命令详解
  • 【踩坑】修复报错libcurl.so.4、LIBFFI_BASE_7.0、libssl.so.3
  • python网络爬虫基础:html基础概念与遍历文档树
  • 【已解决】MacOS上VMware Fusion虚拟机打不开的解决方法
  • 经典视觉神经网络1 CNN
  • 一些硬件知识【2024/12/6】
  • 网络安全法-网络安全支持与促进
  • 【Docker】如何在Docker中配置防火墙规则?
  • Cesium 问题: 添加billboard后移动或缩放地球,标记点位置会左右偏移
  • 使用Python3 连接操作 OceanBase数据库
  • SpringBoot该怎么使用Neo4j - 优化篇
  • Flutter如何调用java接口如何导入java包
  • Redis 数据结构(一)—字符串、哈希表、列表
  • day1:ansible
  • 如何设置Java爬虫的异常处理?
  • 阿里云盘permission denied
  • 在 Ubuntu 24 上安装 Redis 7.0.15 并配置允许所有 IP 访问
  • 构建高效可靠的分布式推理系统:深入解析控制器与模型服务的协同工作
  • springboot394疫情居家办公系统(论文+源码)_kaic
  • 共筑数字安全防线,2024开源和软件安全沙龙即将启幕
  • 后端报错: message: “For input string: \“\““
  • 39 矩阵置零
  • 使用伪装IP地址和MAC地址进行Nmap扫描
  • linux安装docker和mysql
  • 贪心算法专题(四)
  • QT 多级嵌套结构体,遍历成员--半自动。<模板+宏定义>QTreeWidget树结构显示
  • NLP-中文分词
  • 详解LeetCode地下城游戏(动态规划)——区分两种状态表示形式