一、什么是泛型
源码
1.泛型类和泛型方法兼复用性、类型安全和高效率于一身,是与之对应的非泛型的类和方法所不及。泛型广泛用于容器(collections)和对容器操作的方法中。.NET框架2.0的类库提供一个新的命名空间System.Collections.Generic,其中包含了一些新的基于泛型的容器类。要查找新的泛型容器类(collection classes)的示例代码,请参见基础类库中的泛型。当然,你也可以创建自己的泛型类和方法,以提供你自己的泛化的方案和设计模式,这是类型安全且高效的。
二、泛性优点
1.在我们.net 1.0刚刚推出的时候,我们有不同的类型调用同一个方法的时候,要么给每一个类型写一个专门的方法,还有一种处理方案就是,利用了我们继承的特点,因为Object是所有类型的基类,我们就可以定义一个Object参数的方法,但是这样会有一个缺点,我们都知道Object是引用类型,当我们实际的参数是值类型的时候需要拆箱、装箱操作这里就是没必要的消耗了。
/// <summary> /// 我们可以做一个测试,将三种方法进行一亿次操作对比时间消耗 /// </summary> public void Show() { Console.WriteLine("****************Monitor******************"); { //我们先创建几个计数的变量 int iValue = 12345; long commonSecond = 0; long objectSecond = 0; long genericSecond = 0; //这个是普通类型的方法 { Stopwatch watch = new Stopwatch(); watch.Start(); for (int i = 0; i < 100000000; i++) { ShowInt(iValue); } watch.Stop(); commonSecond = watch.ElapsedMilliseconds; } //这个是Object类型的方法 { Stopwatch watch = new Stopwatch(); watch.Start(); for (int i = 0; i < 100000000; i++) { ShowObject(iValue); } watch.Stop(); objectSecond = watch.ElapsedMilliseconds; } //这个是泛型类型的方法 { Stopwatch watch = new Stopwatch(); watch.Start(); for (int i = 0; i < 100000000; i++) { ShowT<int>(iValue); } watch.Stop(); genericSecond = watch.ElapsedMilliseconds; } Console.WriteLine("commonSecond={0},objectSecond={1},genericSecond={2}" , commonSecond, objectSecond, genericSecond); } } #region 实例一 /// <summary> /// 打印个int值 /// </summary> /// <param></param> public static void ShowInt(int iParameter) { //Console.WriteLine(iParameter); } /// <summary> /// 打印个string值 /// </summary> /// <param></param> public static void ShowString(string sParameter) { //Console.WriteLine(sParameter); } /// <summary> /// 打印个DateTime值 /// </summary> /// <param></param> public static void ShowDateTime(DateTime dtParameter) { //Console.WriteLine(dtParameter); } /// <summary> /// 当我们的方法需要给多个类型调用的时候,在没有泛型之前我们 /// 就只能使用object 基类来做这样的事情,但是确定就是object是引用 /// 类型或造成没必要的拆箱装箱操作 /// </summary> /// <param></param> public static void ShowObject(object oParameter) { //Console.WriteLine(oParameter); } /// <summary> /// .Net 2.0出现来,我们可以使用T作为一个展位的类型, /// T只有会在编译的时候才会获取我们的类型,达到一种延迟 /// 效果。 /// </summary> /// <typeparam></typeparam> /// <param></param> public void ShowT<T>(T oParameter) { //Console.WriteLine(oParameter); } #endregion