导航

泛型

Posted on 2017-10-31 20:32  杨彬Allen  阅读(144)  评论(0编辑  收藏  举报

.Net Framework 1.0的时候还在用object装箱,.Net Framework 2.0的加入了泛型。这不是语法糖,而是由框架升级提供的功能。

声明方法的时候没有指定类型,而是在调用的时候指定。这样的好处有哪些?

 

一、泛型方法

1、延迟声明:把参数类型的声明推迟到调用

2、延迟思想:推迟一切可以推迟的

3、又叫马儿跑、又叫马儿不吃草:泛型方法性能上和普通方法上是一致的,并没有变好或者变差,在JIT的时候才确定是何种类型。

  Common和泛型差不多,Object明显不如前面两个。为什么呢?Object是引用类型,分配在堆里的,有一个装箱拆箱的动作,所以慢一点。

4、泛型类的静态字段,是独立的。从性能一般的字典缓存升级到泛型缓存

 

public static T DoNothing<T>(T tParameter)

where T: InterfaceXX //接口约束

where T: class //引用类型约束

where T: struct //值类型约束

where T: new() //无参数构造函数约束

where T : class

{

  return default(T);//会根据T的类型,去产生一个默认值;

}

 

 

二、泛型类

1、解决不同类型,相同方法的重用

2、带来权利,可以使用基类里面的属性和方法

3、带来义务,类型参数必须是基类或者子类

 

三、泛型接口

 

四、泛型委托

 

五、协变逆变(接口、方法、委托都可以用协变逆变)

1、只能放在接口或者委托的泛型参数前面

public interface IEnumerable<out T>

out 协变covariant 修饰返回值,消除List<父类> l=new List<子类>时编译器不通过的问题

in 逆变contravariant 修饰传入参数,强制<子类> = <父类>的参数必须是子类的bug