泛型,.net 2.0之后出现,基本只要代码中出现 ‘<>’ 尖括号就可以确定是泛型。
在2.0之前大多是使用Object来代替,因为所有类都是Object的派生类,根据继承的原理Object可以代替所有派生类,相反他的派生类也可以代替他的基类
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 int paramInt = 123; 6 string paramString = "字符串"; 7 DateTime parmDateTime = DateTime.Now; 8 9 Console.WriteLine("这是Object方法调用方法传递。"); 10 ObjectMethod.ObjectGo(paramInt); 11 ObjectMethod.ObjectGo(paramString); 12 ObjectMethod.ObjectGo(parmDateTime); 13 14 15 16 Console.ReadLine(); 17 } 18 }
1 public static class ObjectMethod 2 { 3 public static void ObjectGo(object param) 4 { 5 Console.WriteLine("这是Object方法接收到的参数:{0} ,参数类型:{1}",param,param.GetType()); 6 } 7 }
上面这个例子,大家也能看到,当想使用一个方法来接多种类型的参数时使用了Object类型,这是一种很古老的写法了,而且在装箱拆箱上面也有问题,因为这个ObjectGo方法并不清楚他要接收什么类型的参数,可能是string可能是int,也可能是其他自定义类型,简单点说就是可能是值类型也有可能是引用类型,比如当我int类型的参数向方法中传递时,应为int类型为引用类型在栈中存储而Object是值类型在堆中存储所以当int类型向方法中传递时就会发生一次由栈向堆中内存的Copy也就是一次拆箱,但是当参数传递到方法中时发现参数类型为int引用类型,接着就又装箱。
在2.0之后泛型出来了,完全可以使用泛型来传递参数的类型,从而来避免这一次没有必要的装箱拆箱
1 public static class GenericMethod 2 { 3 public static void GenericGo<T>(T param) 4 { 5 Console.WriteLine("这是泛型方法接收到的参数:{0} ,参数类型:{1}", param, param.GetType()); 6 } 7 }
1 GenericMethod.GenericGo<int>(paramInt);//<T>可以省略 2 GenericMethod.GenericGo(paramString); 3 GenericMethod.GenericGo(parmDateTime);
以下时两个方法分别的运行时间: