泛型

概述

泛型并不是一个全新的结构,泛型不仅是C#编程语言的一部分,而且是程序集中的IL中间语言代码紧密的集成,有了泛型就可以创建独立于被包含类型的类和方法了,我们不必给不同类型编写功能相同的许多方法和类,只创建一个方法和类就好。

优点和缺点

1、性能

C#类是引用类型,结构是值类型,对值类型使用非泛型集合类,在把值类型转换为引用类型和把引用类型转换为值类型时,需要进行拆箱和装箱。装箱和拆箱操作很容易使用,但性能损失比较大,遍历许多项时尤其如此。

例子1:使用非泛型类将引用类型转换为值类型

var list=new ArrayList();
list.Add(1);//值类型强制转换为引用类型
int il=(int)list[0];//引用类型强制转换为值类型
foreach(int i2 in list)
{
       Console.WriteLine(i2);// unboxing
}

例子2:List<T>类的泛型类型定义为Int,所以Int类型在JIT编译器动态生成的类中使用,不再进行装箱和拆箱

var list=new List<int>();
list.Add(1);//泛型类并不需要装箱
int il=list[0]//此过程也不需要拆箱
foreach(var i2 in il)
{
     Console.WriteLine(l2);
}

结论:使用例子2要比使用例子1性能高

2、类型安全

例子1:非泛型类ArrayList中添加一个整数、一个字符串和一个MyClass类型的对象

var list=new ArrayList();
list.Add(1);//添加数值
list.Add("hello world");
list.Add(new MyClass());
foreach(int i in list)
{
Console.WriteLine(i);
}

当编译时不会出错,但代码允许时会异常,非泛型类导致了安全隐患的存在。

  例子2:在泛型类List<int>中,泛型类型T定义了允许使用的类型,这种就只能把整数类型的元素添加在集合中,就避免了运行出错

var list =new List<int>();
list.Add(1);
list.Add("hello world");//编辑时报错
list.Add(new MyClass());//编译时报错

3、二进制代码的重用

4、代码的扩展

因为泛型类的定义会放在程序集中,所以用特定类型实例化泛型类不会再IL代码中复制这些类,但是在JIT编译器把泛型类编译为本地代码时,会给每个值类型创建一个新类,引用类型共享一个本地类的所有相同的实现代码,这是因为引用类型在实例化的泛型类中只需要4个字节的内存地址就可以引用一个引用类型。

5、命名约定

   a,泛型类型的名称用字母T作为前缀

   b,如果没有特殊要求,泛型类型允许使用任意类代替,且只使用了以个泛型类型,就可以用T作为泛型类型的名称

   c,如果泛型类型有特定的要求(例如,它必须实现一个借口或派生自基类),或者使用了两个或多个泛型类型,就应该给泛型类型使用描述性的名称

        如:SortedList<TKey,TValue>;


你可能感兴趣的:(泛型)