1. 泛型优势:
源代码保护
类型安全
更加清晰的代码
更佳的性能.(减少装箱和拆箱的操作)
2. Wintellect 的Power Collections库
C++的标准模板库的部分集合类
3.泛型基础结构
开放类型和封闭类型
一个泛型的所有类型实参传递的都是实际的数据类型,则成为封闭类型.
具有泛型类型参数的类型成为开放类型,CLR禁止构造开放类型的实例.类似禁止构造接口实例.
如:var t=typeof(Dictionary<,>); var o=CreateInstance(t);这样是不行的.需要制定类型之后在构造.
CLR会为类型对象分配静态字段,对于泛型,List<string>和List<DateTime>,有各自的静态字段,是独立的.
如果一个程序集中使用 了List<string>,CLR只会为这个类型编译一次代码,一个完全不同的程序集加载进来的时候,也会使用这同一个编译过的代码.同时,CLR认为引用类型实参是完全相同的,CLR为List<string>方法编译的代码可以直接用于List<Stream>的方法.因为String和Stream均未引用类型,都是指向堆上的对象的指针.值类型则是专门生产本地代码.
逆变和谐变
in 逆变 意味着泛型类型参数可以从一个街垒更改为派生类
out协变 意味着泛型类型参数可以从一个派生类改为基类
如:public delegate TResult Func<in T,out TResult>
Func<Object,ArgumentException> fn1=null;
可以转型为Func<string,Exception>
泛型方法
CLR允许一个方法指定他独有的类型实参
如:
public class CustomOrder<T>
{
private T _test;public TOutPut Order<TOutPut>(TOutPut inTest)
{
return inTest;
}
}
泛型方法和类型推断
为了增强使用泛型时的可读性,C#编译器支持泛型类型推断,如:可以推断出value的类型.
public class CustomOrder
{public void Display<Tout>(Tout toDisplay)
{}
}public class UseTest
{
public void Test()
{
var value = 10;
new CustomOrder().Display(value);
new CustomOrder().Display<int>(value);
}
}
泛型类型的可验证问题
对于泛型类型,可以使用default(T),会初始化为null,或0.不能够直接设为null,如T s=null,是不行的,因为值类型是不能设为null的,除非T加了限定是引用类型.
直接对泛型类型进行强猴子转换也是不行的,如T value, var t=(int)value,是错误的.可以这样var t=(int)(object)value,但是虽然能通过编译,但很可能出错.
泛型变量,和null进行比较,如果为值类型,则永远为false.
不能直接对泛型参数用==比较,除非T被约束为class.