第二部分 设计类型:第12章 泛型

泛型的好处1.代码重用。2.算法重用。

泛型参数要么称为T,要不以T开头(如TKey和TValue)。大写T代表类型Type。

代码演示:

private static void SomeMethod(){

   //构造一个List来操作DateTime对象

   List<DateTime> dtList = new List<DateTime>();

   

   //向内部添加DateTime对象

   dtList.Add(Datetime.Now); //不进行装箱

   

   //向列表添加另一个DateTime对象

   dtList.Add(DateTime.MinValue); //不进行装箱

   

   //尝试向列表中添加一个String对象

   dtList.Add("1/1/2004");  //编译时出错

   

   //从列表提取一个DateTime对象

   DateTime dt = dtList[0]; //不需要转型

}

以上代码表明了泛型的优势
1.源代码保护。
2.类型安全。
3.更清晰的代码。
4.更佳的性能。

将泛型List算法应用于Int32类型,速度比非泛型ArrayList算法快的多,差别30倍左右。
因为ArrayList操作值类型(Int32)会造成大量装箱操作。
使用引用类型测试速度差不多,但泛型还是更有优势:代码清晰、编译时类型安全。

 

12.1 Framework类库中的泛型
泛型最广泛的应用就是集合类。FCL定义了几个泛型集合类。大多数在System.Collections.Generic和System.Collections.ObjectModel命名空间中。
在开发中推荐使用泛型集合。

新的泛型接口并不是设计来完全取代旧的泛型接口。许多时候为了保证向后兼容。我们不得不同时使用两者。例如,如果List<T>类只实现了IList<T>接口,就没有代码能将一个List<DateTime>对象看成是一个IList了。

System.Array类(所有数组类型的基类)提供了大量泛型方法。如,ForEach,Sort,Find,FindIndex等。

下面展示了部分方法:

public abstract class Array: ICloneable,IList,ICollection,IEnumerable,IStrucurealComparable,IStruscturalEqueatable{

  public static void Sort<T>(T[] array);

  pblic static void Sort<T>(T[] array,Icomparer<T> comparer);

 

  public static Int32 BinarySearch<T>(T[] array,T value);

  public static Int32 BinarySearch<T>(T[] array,T value),IComparer<T> comparer);

  ...

}

以下代码展示了如何使用其中一些方法:

public static void Main(){

  //创建并初始化一个字节数组

  Byte[] byteArray = new Byte[]{5,1,4,2,3};

 

  //调用Byte[]排序算法

  Array.Sort<Byte>(byteArray);

 

  //调用Byte[]二叉搜索算法

  Int32 i = Array.BinarySearch<Byte>(byteArray,1);

  Console.WriteLine(i); //显示"0"

}

 

 

12.2  Wintellect的Power Collections库
Power Collections这个库由一系列集合类构成。这些集合类本身是泛型,同时全面利用了泛型。
(详细请访问Wintellect.com)。

表12-1总结了Power Collections库包含的部分集合类:

 

12.3 泛型基础结构

 

12.3.1 开放类型和封闭类型
贯穿全书,讨论了CLR如何为应用程序使用的每个类型创建一个内部数据结构。这种数据结构称为类型对象(type object)。

具有泛型类型参数的类型称为开发类型(open type),CLR    禁止构造开放类型的任何实例。这点类似于CLR禁止构造接口类型的实例。

为所有类型实参传递的都是实际数据类型,类型就称为封闭类型(closed type)。CLR允许构造封闭类型的实例。

CLR会在类型对象内部分配类型的静态字段。因此,每个封闭类型都有自己的静态字段。

 

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