拆箱和装箱
从值类型转换为引用类型为装箱
,把引用类型转换为值类型为拆箱
函数
装箱和拆箱很容易使用,可是性能损失比较大,尤为是遍历许多项的时候。性能
List<T>
不使用对象,在使用时定义类型this
var list = new List<int>(); list.Add(44); // no boxing int item = list[0]; // mo unboxing
不妨将
List<T>
看作一种新的类型,不在特地的和C++的模板相比较;code
T
做为前缀;泛型类型容许使用任意类替代,且只使用了一个泛型类型就能够用T
做为泛型类型的名称对象
public class List<T>{} public class LinkedList<T>{}
若泛型类型有特定需求(例如必须实现一个接口或派生自基类),或者使用了两个或多个泛型类型
继承
public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e); public delegate TOutput Converter<TInput, TOutput>(TInput from); public class SOrtedList<TKey, TValue>{}
# 泛型类的功能
## 默认值接口
建立泛型时,不能把null赋予泛型类型 ;在这个时候,咱们就须要
default
,将null
赋予引用类型,0赋值于值类型;string
public T GetDocument() { T doc = default(T); lock(this) { doc = documentQueue.Dequeue(); } return doc; }
## 约束it
若泛型类须要调用泛型类型中的方法,就必须添加约束
where
table
泛型支持如下几种约束类型:
约束 | 说明 |
---|---|
where T: struct | 对于结构约束,T必须是值类型 |
where T: class | T必须是引用类型 |
where T: IFoo | T必须实现接口IFoo |
where T: Foo | T 必须派生基类Foo |
where T: new() | 构造函数约束,T必须有一个默认构造函数 |
泛型类型也能够合并多个约束,where T: IFoo, new()
约束和MyMerge<T>
申明指定,T必须实现IFoo接口,且必须有一个默认构造函数,示例以下所示:
public class MyMerge<T> where T: IFoo, new() { // dosomething }
泛型类型能够实现泛型接口,也能够派生自类,固然也能够派生自泛型基类;
public class Base<T>{} public class Derived<T>: Base<T> {} // 派生自泛型基类
固然,泛型类型派生自指定基类的类型:
public class Base<T>{} public class Derived<T>: Base<string>{}
泛型类的静态成员只能在类的一个实例中共享
// 定一个泛型类的静态成员 public class StaticDemo<T> { public static int x; } StaticDemo<int>.x = 3; // 第一组静态字段 = 3 StaticDemo<string>.x = 4; // 第二组静态字段 = 4 Console.WriteLine(StaticDemo<int>.x); // 这里将会输出3
# 泛型接口
使用泛型能够定义接口,在接口定义的方法能够带泛型参数
在.Net中,参数类型是
协变
的
例如,有Shape和Circle类,Circle派生自Shape,Display方法是为了接受Shape类型的参数
public void Display(Shape object){}
如今能够传递派生自Shape基类的任意对象,例如Circle,Rectangle
Circle c = new Circle(5); Display(c); // 这里即是协变
方法的返回类型是
抗变
的
例如,若方法返回一个Shape,就不能把它赋予Circle,可是反过来就能够;
若泛型类型使用
out
标注,泛型接口就是协变
的,意味着返回类型也是T
若泛型类型使用in
标注,泛型接口就是抗变
的,代表传入的参数类型只能是T