public void Show(int iParameter) { Console.WriteLine("处理INT类型数据!"); } public void Show(string iParameter) { Console.WriteLine("处理string类型数据"); }
.net 1.0时代的时候,我们需要处理不同参数而方法逻辑又是一样的情况下,我们只能分别给两个不同参数分别写上对应的方法才行。
但是有没有更好的办法?这里的的答案是肯定由的~
比如用我们的obj类型的参数,为什么OBJ类型可以满足了,因为有两条公理可以证明!
1.Object是所有类型的父类。
2.所有父类出现的地方都可以用子类来代替!(仔细阅读,画重点!)
正因为有这两条公理所以我们推断出下面的方法!
public void Show(object oParameter) { Console.WriteLine("处理所有类型的数据"); }这个方法就可以把所有的类型的参数传递进去,但是会有一个很大的缺陷,会有拆箱和装箱的操作!
下面我们测试一波试试哈!
public static void Test(int iParameter) { } public static void TestObject(object oParameter) { }先写上两个简单的方法,里面什么都不做,就是为了不会被任何因素影响!
然后我们在每个方法调用一亿次!
{ Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); for (int i = 0; i < 100000000; i++) { Test(iValue); } stopwatch.Stop(); Console.WriteLine("普通方法花费时间为:{0}", stopwatch.ElapsedMilliseconds); } { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); for (int i = 0; i < 100000000; i++) { TestObject(iValue); } stopwatch.Stop(); Console.WriteLine("装箱拆箱花费时间为:{0}", stopwatch.ElapsedMilliseconds); }然后我们再看运行结果!
取绝对值的话,感觉OBJ和普通方法相差了一倍!
所以这个性能上还是缺失很大,所以有没有一种东西能够鱼和熊掌兼得了?
答案又是肯定的。
在.NET 2.0时代,这个神奇事情终于出现了!!!! 隆重推出了我们的 大泛型~ (此处应该响起掌声!!!)
public static void Show<T>(T tParameter) { Console.WriteLine("This is {0},parameter={2},type={1}", typeof(GenericMethod), tParameter.GetType().Name, tParameter.ToString()); }这个尖括号中的<T> 就是声明的意思,然后在传递这个T进来。
语法就是这样啦~
泛型在声明的时候,并不知道是什么类型的,只是在调用的时候才能指定!
泛型运用的是延迟思想,把参数类型延迟到调用的
我们的<T> 在经过编译的时候,会用`T 来代替
从我们写的时候->编译器->dll/exe 在这段时间的时候都是`T ,经过了CLR的时候才会确定类型是什么,在CLR的时候他会把类型传进去然后就会将其生成为普通方法。
然后我们来测试一波运行速度~
约束:
public void Show<T>(T tParameter) { Console.WriteLine("{0}", tParameter.GetType().Name); } /// <summary> /// 父类约束 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="tParameter"></param> public void ShowParent<T>(T tParameter) where T:MobilePhone //父类约束 { Console.WriteLine("{0}", tParameter.GetType().Name); } /// <summary> /// 支付接口约束 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="tParameter"></param> public void ShowIPayment<T>(T tParameter) where T:IPayment { Console.WriteLine("{0}", tParameter.GetType().Name); } /// <summary> /// 拍照接口约束 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="tParameter"></param> public void ShowIPhotograph<T>(T tParameter) where T:IPhotograph { Console.WriteLine("{0}", tParameter.GetType().Name); } /// <summary> /// 父类加上支付接口约束 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="tParameter"></param> public void ShowMobilePhoneIPayment<T>(T tParameter) where T:MobilePhone,IPayment { Console.WriteLine("{0}", tParameter.GetType().Name); } /// <summary> /// 引用类型约束 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="tParameter"></param> public void ShowClss<T>(T tParameter) where T: class { Console.WriteLine("{0}", tParameter.GetType().Name); } /// <summary> /// 值类型约束 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="tParameter"></param> public void ShowStruct<T>(T tParameter) where T :struct { Console.WriteLine("{0}", tParameter.GetType().Name); } /// <summary> /// 引用类型约束 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="tParameter"></param> public void ShowClass<T>(T tParameter) { Console.WriteLine("{0}", tParameter.GetType().Name); } /// <summary> /// 父类和无参构造函数约束 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="tParameter"></param> public void ShowMobilePhoneNew<T>(T tParameter) where T: MobilePhone,new() { Console.WriteLine("{0}", tParameter.GetType().Name); }