泛型(Generic) 允许您延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候。换句话说,泛型允许您编写一个可以与任何数据类型一起工作的类或方法。

您可以通过数据类型的替代参数编写类或方法的规范。当编译器遇到类的构造函数或方法的函数调用时,它会生成代码来处理指定的数据类型。下面这个简单的实例将有助于您理解这个概念:

using System;
using System.Collections.Generic;namespace GenericApplication
{public class MyGenericArray<T>{private T[] array;public MyGenericArray(int size){array = new T[size + 1];}public T getItem(int index){return array[index];}public void setItem(int index, T value){array[index] = value;}}class Tester{static void Main(string[] args){// 声明一个整型数组MyGenericArray<int> intArray = new MyGenericArray<int>(5);// 设置值for (int c = 0; c < 5; c++){intArray.setItem(c, c*5);}// 获取值for (int c = 0; c < 5; c++){Console.Write(intArray.getItem(c) + " ");}Console.WriteLine();// 声明一个字符数组MyGenericArray<char> charArray = new MyGenericArray<char>(5);// 设置值for (int c = 0; c < 5; c++){charArray.setItem(c, (char)(c+97));}// 获取值for (int c = 0; c < 5; c++){Console.Write(charArray.getItem(c) + " ");}Console.WriteLine();Console.ReadKey();}}
}

当上面的代码被编译和执行时,它会产生下列结果:

0 5 10 15 20
a b c d e

泛型(Generic)的特性

使用泛型是一种增强程序功能的技术,具体表现在以下几个方面:

  • 它有助于您最大限度地重用代码、保护类型的安全以及提高性能。
  • 您可以创建泛型集合类。.NET 框架类库在 System.Collections.Generic 命名空间中包含了一些新的泛型集合类。您可以使用这些泛型集合类来替代 System.Collections 中的集合类。
  • 您可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。
  • 您可以对泛型类进行约束以访问特定数据类型的方法。
  • 关于泛型数据类型中使用的类型的信息可在运行时通过使用反射获取。

泛型(Generic)方法

在上面的实例中,我们已经使用了泛型类,我们可以通过类型参数声明泛型方法。下面的程序说明了这个概念:

using System;
using System.Collections.Generic;namespace GenericMethodAppl
{class Program{static void Swap<T>(ref T lhs, ref T rhs){T temp;temp = lhs;lhs = rhs;rhs = temp;}static void Main(string[] args){int a, b;char c, d;a = 10;b = 20;c = 'I';d = 'V';// 在交换之前显示值Console.WriteLine("Int values before calling swap:");Console.WriteLine("a = {0}, b = {1}", a, b);Console.WriteLine("Char values before calling swap:");Console.WriteLine("c = {0}, d = {1}", c, d);// 调用 swapSwap<int>(ref a, ref b);Swap<char>(ref c, ref d);// 在交换之后显示值Console.WriteLine("Int values after calling swap:");Console.WriteLine("a = {0}, b = {1}", a, b);Console.WriteLine("Char values after calling swap:");Console.WriteLine("c = {0}, d = {1}", c, d);Console.ReadKey();}}
}

当上面的代码被编译和执行时,它会产生下列结果:

Int values before calling swap:
a = 10, b = 20
Char values before calling swap:
c = I, d = V
Int values after calling swap:
a = 20, b = 10
Char values after calling swap:
c = V, d = I

泛型(Generic)委托

您可以通过类型参数定义泛型委托。例如:

delegate T NumberChanger<T>(T n);

下面的实例演示了委托的使用:

using System;
using System.Collections.Generic;delegate T NumberChanger<T>(T n);
namespace GenericDelegateAppl
{class TestDelegate{static int num = 10;public static int AddNum(int p){num += p;return num;}public static int MultNum(int q){num *= q;return num;}public static int getNum(){return num;}static void Main(string[] args){// 创建委托实例NumberChanger<int> nc1 = new NumberChanger<int>(AddNum);NumberChanger<int> nc2 = new NumberChanger<int>(MultNum);// 使用委托对象调用方法nc1(25);Console.WriteLine("Value of Num: {0}", getNum());nc2(5);Console.WriteLine("Value of Num: {0}", getNum());Console.ReadKey();}}
}

当上面的代码被编译和执行时,它会产生下列结果:

Value of Num: 35
Value of Num: 175

C# 泛型(Generic)相关推荐

  1. 泛型方法的定义和使用_泛型( Generic )

    泛型(Generic) 1. 泛型概述 泛型是一个未知的, 不确定的数据类型. 比如ArrayList 中的E, 就是一个未知的不确定的数据类型, 那么他就是一个泛型 泛型虽然是一个未知的, 不确定的 ...

  2. 你真的了解泛型 Generic 嘛?

    泛型 Generic Programming[1] 通常指允许程序员在强类型程序设计语言中,编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型,即类型参数化 首先我们不是科班讨论学术, ...

  3. Java - 泛型 ( Generic )

    Java - 泛型 ( Generic ) > 泛型的特点 > 解决元素存储的安全性问题 > 解决获取数据元素时,需要类型强转的问题 > 不能在 static 方法中使用泛型, ...

  4. DotNET:LINQ对泛型(Generic)操作和泛型方法及属性

    ylbtech-DotNET:泛型(Generic)和LINQ操作 1,遍历泛型集合 2,根据索引位置移除项(RemoveAt()) 3,查询一个人(Single()) 3.2,查询一个人(Singl ...

  5. 泛型(generic)概述和基本使用

    泛型(generic)概述和基本使用 A:泛型概述 集合边上有一个尖括号,尖括号指的就是泛型. 限定集合存储的数据类型,如果加上这个引用数据类型, 就告诉你这个集合只能存储该类型对象和该类型的子类对象 ...

  6. java泛型(Generic)超详细

    目录 1.为什么要有泛型(Generic)? 2.泛型的设计背景 2.1那么为什么要有泛型呢,直接Object不是也可以存储数据吗? 3.在集合中使用泛型 4.自定义泛型结构 4.1自定义泛型结构:泛 ...

  7. Java泛型(1)--集合使用泛型Generic、自定义泛型、泛型在继承上的体现、通配符的使用

    文章目录 泛型的概念 集合中使用泛型 自定义泛型结构 泛型在继承上的体现 通配符的使用 泛型的概念 集合容器类在设计阶段/声明阶段不能确定这个容器实际存的是什么类型的对象,所以在JDK1.5之前只能把 ...

  8. Java程序低手之关于泛型(Generic)

    虽然一直以来,Java都提供了强制类型转换,但是那确实是Java的弱点,因为你是在取数据的时候才保证了类型安全(Type-safe),而不是在存储数据的时候就做好这项工作,Java5提供了Generi ...

  9. Java学习打卡第七天——[再谈Collection之Set,TreeSet,泛型Generic的简介和使用]

    说明:为了文章的简洁性和方便阅读在以后的打卡过程中,我会给出核心代码 Javaee之[Collection之Set] Javaee之[Collection之TreeSet] Javaee之[Colle ...

  10. 泛型(Generic)-反射泛形-Dao

    JDK5中的泛形允许程序员在编写集合代码时,就限制集合的处理类型,从而把原来程序运行时可能发生问题,转变为编译时的问题,以此提高程序的可读性和稳定性(尤其在大型程序中更为突出). 注意:泛型是提供给j ...

最新文章

  1. 福利 | 16场精选活动干货、精华笔记、课件分享:数据派独家讲座干货大合集
  2. 文章推荐 | 城市规划中城市信息学的研究进展
  3. LinearLayout测量原理解析:onMeasure(int,int)
  4. PHP实现简单顺序栈
  5. javascript array sort()
  6. MySQL源码学习:MySQL中禁止跨库访问的实现
  7. linux删除文件夹提示没找到,Win10中遇到删除文件夹提示找不到该项目的解决过程...
  8. 关于web爬虫的tips
  9. :批量制作档案表,要从excel表格中将每个人的数据导入到docx档案
  10. Oracle的配置文件
  11. mysql主从配置查看_MySQL主从配置 - MySQL入门教程_数据库技术_Linux公社-Linux系统门户网站...
  12. SHA-512摘要算法(带示例)
  13. 美元符号在什么计算机语言,美元符号是什么?怎么打?
  14. Linux里怎么打开pt文件,在 Linux 上安装 transmission 进行远程 PT 下载
  15. python colormap jet_Opencv:Jetmap或colormap到灰度,反转applyColorMap()
  16. 如何使用 Firebase 建立短網址?
  17. linux 深度定制,基于ubuntu发行版的安装界面的深度定制过程
  18. 运营管理最新版史蒂文森_《运营管理(英文版第11版注解版国际经典原版教材)》(美)威廉J.史蒂文森著【摘要 书评 在线阅读】-苏宁易购图书...
  19. 使用反射生成 JDK 动态代理
  20. 智慧景区电子票务系统人脸识别售检票基本思路

热门文章

  1. python学习-类(global、nonlocal、继承、多态)
  2. 贵州计算机专业强的专科学校,贵州排名靠前的五年制大专学校--贵州计算机学校...
  3. c语言中 文件的字符串输入函数是6,【C语言】文件操作及输入输出格式(文件常用的库函数)...
  4. java url 双引号_java - Java在POST请求中发送带有转义双引号的JSON字符串[duplicate] - 堆栈内存溢出...
  5. iis7.0 https访问显示403访问被拒绝_提高网站访问性能——Tomcat优化
  6. 【STM32入门】这个项目绝了,用手势来产生波形,基于手势控制的波形发生器
  7. 嫦娥五号完美落月,背后黑科技令人惊叹
  8. 酷!GitHub开发者自研火星车,开发教程全面开源
  9. Java中加减乘除怎样写代码,【求助】怎样实现加减乘除 代码如下
  10. manjaro双系统 windows_Win10和Manjaro双系统安装记录