泛型从2.0版开始支持,他与程序集中IL(中间语言)代码紧密的集成。有了泛型,我们不必要给不同的类型编写功能相同的方法和类,仅仅创建一个方法或者类就可以。
使用泛型还有一个目的,减少代码中使用object类,object类不是类型安全,而且使用发现避免了object类使用过程中的装箱和拆箱的过程,提高性能。
泛型类的格式 class MyClass<T>{}
泛型方法 T Function<T>()
泛型接口 interface MyInterfac <T>
可能有些朋友就说,为什么我们要用字母 T 呢,没有为什么,你想用B也可以,但是这个T是大家几乎约定俗成的。 多个泛型类型时候,我们约定俗成的头字母 Txx
安全性。装箱拆箱
为什么说,泛型可以提高安全性及装箱、拆箱的过程呢?来个简单的代码你们就知道了
var list = new ArrayList(); list.Add(44); //装箱 list.Add("mystring"); list.Add(new MyClass());
int i = (int)list[0]; //拆箱
这个list的就是不安全的,如果我们要对他继续类型转换,那么他就会出现异常。而且他add int类型,string类型的时候就要涉及装箱,你取出来的时候要涉及的拆箱
默认值
我们可以用default关键字为 泛型 设置默认值
public T GetT() { return default(T); }
约束
在泛型中,如果我们希望对泛型的类型进行一些类型限制,那么我们就可以用关键字where进行限制
下表列出了六种类型的约束:
约束 |
说明 |
---|---|
T:struct |
类型参数必须是值类型。 可以指定除 Nullable 以外的任何值类型。 有关更多信息,请参见 使用可以为 null 的类型(C# 编程指南)。 |
T:类 |
类型参数必须是引用类型;这一点也适用于任何类、接口、委托或数组类型。 |
T:new() |
类型参数必须具有无参数的公共构造函数。 当与其他约束一起使用时,new() 约束必须最后指定。 |
T:<基类名> |
类型参数必须是指定的基类或派生自指定的基类。 |
T:<接口名称> |
类型参数必须是指定的接口或实现指定的接口。 可以指定多个接口约束。 约束接口也可以是泛型的。 |
T:U |
为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。 |
class EmployeeList<T> where T : Employee, IEmployee, System.IComparable<T>, new() { // ... }
这个是多类,接口,无参数的公共构造函数 各种进行了约束
如果在泛型类中使用staitc 变量,他们如果对这个变量赋值,是不是都是公有一个static变量呢。实际上是不会的,不同的泛型类型都是用自己独立的static变量