泛型集合
lisit<>
优势
1.性能高
对值类型使用非泛型集合类,在把值类型转换为引用类型,和把引用类型转换为值类型时,须要进行装箱和拆箱的操做。装箱和拆箱的操做很容易实现,可是性能损失较大, 假如使用泛型,就能够避免装箱和拆箱操做。
此为集合。
ArrayList list=new ArrayList();
list.Add(20); //装箱,list存放的是object类型元素,须将值类型转化为引用类型
int i=(int)list[0]; //拆箱,list[0]的类型是object,要赋值就得把引用类型转化为值类型
此为泛型集合。
List<T> list=new List<int>();
list.Add(20); //由于指定了用int来实例化,所以没必要装箱
int i=list[0]; //一样地,访问时也不须要拆箱
2.类型安全。
与Arraylist类同样,若是使用对象,能够在这个集合中添加任意类型。若是使用非泛型编程,以下代码,就有可能在某些状况下会发生异常。
非泛型集合。
ArrayList list=new ArrayList();
list.Add(20);
list.Add("string");
list.Add(new MyClass());
foreach(int i in list)
{
Console.WriteLine(i); //这里会有个异常,由于并非集合中的全部元素均可以转化为int
}
若是使用泛型编程,则能够避免这种异常,让编译器检查出错误。
List<int> list=new List<int>();
list.Add(20);
lsit.Add("string"); //编译时报错,只能报整数类型添加到集合中
list.Add(new MyClass()); //同上
3.二进制代码重用。
泛型能够定义一次,用许多种不一样的类型实例化,泛型能够在一种语言中定义,在另外一种.NET语言中使用。
4.代码的扩展。
由于泛型类的定义会放在程序集中,值类型包含在实例化的泛型类的内存中。而每一个值类型对内存的要求都不一样,因此要为每一个值类型实例化一个新类。
二.特性
1.默认值。
在给类型T初始化时,要注意不能把null赋予泛型类型。由于泛型类型也能够实例化为值类型,而null只能用于引用类型。为了解决这个问题,能够用default关键字。经过default关键字,将null赋予引用类型,将0赋予值类型。
public T GetDoucumet()
{
T doc=default(T);
lock(this)
{
doc=documentQueue.Dequeue();
}
return doc;
}
2.约束。
若是泛型类须要调用泛型类型上的方法,就必须添加约束。 注意:使用泛型类型还能够合并多个约束。where T:IFoo,new()约束和MyClass<T>声明指定,类型T必须执行IFoo接口,且必须有一个默认构造函数。
3.继承。
泛型类型能够执行泛型接口,也能够派生于一个类。泛型类能够派生于泛型基类:
public class Base<T>
{}
public class Derived<T>:Base<string>
{}
要求必须重复接口的泛型类型,或者必须指定基类的类型。
因此,派生类能够是泛型类或非泛型类。如能够定义一个抽象的泛型基类,它在派生类中用一个具体的类型实现。
4.静态成员。
泛型类的静态成员须要特别关注。泛型类的静态成员只能在类的一个实例中共享。
public class StaticDemo<T>
{
public static int x;
}
对一个string类型和一个int类型使用了StaticDemo<T>类,因此存在两组静态字段:
StaticDemo<string>.x=4;
StaticDemo<int>.x=5;
Console.WrileLine(StaticDemo<string>.x); //将会输出4
总结(泛型的优势与特性):编程
性能高,类型安全,二进制代码重用,代码的扩展。安全
默认值,继承,约束,静态成员。函数