泛型介绍

泛型类和泛型方法同时具备可重用性、类型安全和效率,这是非泛型类和非泛型方法无法具备的。泛型通常用在集合中和在集合上运行的方法中。

对应的命名空间为System.Collections.Generic

可以创建自定义泛型类型和方法,以提供自己的通用解决方案,设计类型安全的高效模式。

泛型的优点

在公共语言运行库和c#的早期版本中,通用化是通过在类型与通用机类型objec之间进行强制转换来实现的,泛型提供了针对这种限制的解决方案通过创建泛型类,您可以创建一个在编译时类型安全的集合。

使用非泛型集合类的限制可以通过编写一笑程序来演示,该程序利用,该程序利用.net framework基类库中的ArrayList集合类。ArrayList是一个使用起来非常方便的集合类,无需进行修改即可用来存储任何引用或值类型。

System.Collections.ArrayList list1 = new System.Collections.ArrayList();
list1.Add(3);
list1.Add(105);
 
System.Collections.ArrayList list2 = new System.Collections.ArrayList();
list2.Add("It is raining in Redmond.");
list2.Add("It is snowing in the mountains.");

这种方便是需要代价的,添加到ArrayList中的任何引用或者值类型都隐式地向上强制转换为Object。如果项是值类型,则必须在将其添加到列表中时进行装箱操作,在检索时,进行取消装箱操作。强制转换以及装箱和取消装箱操作都会降低性能;在必须对大型集合进行循环访问的情况下,装箱和取消装箱的影响非常明显。

另一个限制是缺少编译时类型检查;因为ArrayList将把所有项都强制转换为Objec,所以在编译时,无法防止客户端代码执行以下操作:

System.Collections.ArrayList list = new System.Collections.ArrayList();
// Add an integer to the list.
list.Add(3);
// Add a string to the list. This will compile, but may cause an error later.
list.Add("It is raining in Redmond.");

int t = 0;
// This causes an InvalidCastException to be returned.
foreach (int x in list)
{
    t += x;
}
尽管将字符串和整形数字 组合在一个ArrayList中的做法在创建异类集合时是完全合法的,有时是有意图的,但这种做法更可能产生编程错误,并且知道运行时才能检测到此错误。
ArrayList 和其他相类似真正需求的是:客户端代码基于每个实例指定这些类要使用的具体数据类型的方式。这样就不再需要向上强制转换为System.objec.同时编译器也可以进行类型检查。换句话说,ArrayList需要一个type parameter。这正是泛型所能提供的。在N:System.Collections.Generic命名空间的泛型List<T>集合中,向该集合添加项的操作类似与以下形式:
List<int> list1 = new List<int>();
// No boxing, no casting:
list1.Add(3);
// Compile-time error:
// list1.Add("It is raining in Redmond.");
对于客户端代码,与ArrayList相比,使用List<T>时添加的唯一语法是声明和实例化中的类型参数。虽然这稍微增加了些编码的复杂性,但是好处是您可以创建一个比ArrayList更安全并且速度更快的列表,特别适合列表项是值类型的情况。
 
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/RealAlex/p/2920702.html