1、引入泛型
泛型不是一个简单的语法糖,是框架升级支持的
List
List
2、泛型方法
方法名称后面加上尖括号,里面是类型参数,类型参数实际上就是一个类型T声明,方法就可以用这个类型T了。泛型声明方法时,并没有写死类型,T是什么,并不知道,T要等着调用的时候才指定。正式因为没有写死,才拥有了无限的可能。
泛型的设计思想--延迟声明:推迟一切可以推迟的,一切能晚点再做的事,就晚一点再做。泛型不是一个简单的语法糖,是框架升级支持的。泛型方法的性能跟普通方法一直,是最好的,而且还能一个方法满足多个不同类型。
下面来看下代码是怎么写的:
public static void Show(T tParameter)//, T t = default(T { Console.WriteLine("This is {0},parameter={1},type={2}", typeof(CommonMethod), tParameter.GetType().Name, tParameter); }
泛型类、泛型委托等和泛型方法声明类似:
//泛型类 public class GenericClasswhere T : ISports { } //泛型接口 public interface GenericInterface { } //方形委托 public delegate void Do() where T : ISports;
WebService WCF都不能用泛型,为什么?
因为这些是跨语言的,别的语言也能用,不支持泛型,服务在发布的时候是必须确定的,泛型在编译时确定不了。
3、泛型约束
没有约束,其实很瘦局限。
基类约束:
where T:BaseModel
1、可以把T当成基类---权利
2、T必须是BaseModel或者其子类
为什么要有约束?
因为有约束才有权利,自由主义的鼻祖洛克先生说过,有了法律,才有自由。
泛型:不同的类型都能进来,任何的乐行都能过来,你知道我是谁?
where T:class 引用类型约束;引用类型
where T:struct
where T:new() 无参够赞函数约束
public static void Show(T tParameter) //where T : String//密封类约束的不行,因为没有意义 //where T : People //where T : ISports where T : People, ISports, IWork, new() { Console.WriteLine("This is {0},parameter={1},type={2}", typeof(GenericConstraint), tParameter.GetType().Name, tParameter); Console.WriteLine($"{tParameter.Id} {tParameter.Name}"); tParameter.Hi(); //tParameter.Pingpang(); }
public T GetT() //where T : class//引用类型约束 //where T : struct//值类型 where T : new()//无参数构造函数 where S : class { //return null; //return default(T);//default是个关键字,会根据T的类型去获得一个默认值 return new T(); //throw new Exception(); }
4、协变、逆变
.net4.0才出现的,只能放在接口或者委托的泛型参数前面
out协变 covariant,修饰返回值,只能组我诶返回值
in 逆变 contravariant,修饰传输参数,只能作为传入值
public class Bird { public int Id { get; set; } } public class Sparrow : Bird { public string Name { get; set; } } {//协变 IEnumerablebirdList1 = new List (); IEnumerable birdList2 = new List (); Func func = new Func (() => null); ICustomerListOut customerList1 = new CustomerListOut (); ICustomerListOut customerList2 = new CustomerListOut (); } {//逆变 ICustomerListIn customerList2 = new CustomerListIn (); ICustomerListIn customerList1 = new CustomerListIn (); ICustomerListIn birdList1 = new CustomerListIn (); birdList1.Show(new Sparrow()); birdList1.Show(new Bird()); Action act = new Action ((Bird i) => { }); } { IMyList myList1 = new MyList (); IMyList myList2 = new MyList ();//协变 IMyList myList3 = new MyList ();//逆变 IMyList myList4 = new MyList ();//协变+逆变 }
5、泛型缓存
每个不同的T,都会生成一份不同的副本,适合不同的类型,需要缓存一份数据 场景,效率高
如有不对的地方,希望大家多指教!