【C#高级】泛型(一)

  泛型,.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);     

 以下时两个方法分别的运行时间:

 

posted @ 2019-04-13 21:38  阳光下的海啊  阅读(375)  评论(0编辑  收藏  举报