广东长海建设工程有限公司网站,制作和维系一个网站的费用,php 遍历网站,网站空间 按流量计费总所周知#xff0c;.NET出现在.net framework 2.0#xff0c;为什么要在2.0引入泛型那#xff0c;因为微软在开始开发.net框架时并没有想过多个类型参数传输时对方法的重构#xff0c;这样一来#xff0c;开发人员就要面对传输多种类型的参数而不得以写多个方法#xff… 总所周知.NET出现在.net framework 2.0为什么要在2.0引入泛型那因为微软在开始开发.net框架时并没有想过多个类型参数传输时对方法的重构这样一来开发人员就要面对传输多种类型的参数而不得以写多个方法但是开发者的智慧是无限的创造性也由此被挖掘出来在泛型之前便有开发者为了提到代码利用率便想到使用object类型为参数类型来传递参数这无疑解决了多个类型的参数传输时并需要写多个方法的问题。那么object类型为什么能实现接受多个不同类型的参数那有了object类型还为什么要设计泛型那object类型又有那么弊端那其实有点基础的开发人员应该都知道object类型是所有类型的父类通过里氏转换原则我们知道所有父类出现的地方都可以用子类替换这样就可以接收多个参数了同时因为object类型转换装拆箱对性能的影响在2.0时微软推出了泛型。 下面我们引入泛型的声明和调用 public static void ShowT(T tParameter){ Console.WriteLine($This is{typeof(GenericClass)}ShowT,paratype{tParameter.GetType()},value{tParameter};} 打印的内容我们没必要关注我们只看方法头我们可以看到方法头和参数里面加了T这个字母其实这就是泛型声明的规则泛型在声明时需要在方法头加上T(T parm),注意尖括号里面的字母是可变的可以是任何字母但是尖括号里面的字母必须和参数里面的字母要一致这样一个方法就声明好了。 下面我们接下来研究下泛型的调用过程泛型是如何在未命名参数类型的情况下来声明参数类型的在下面程序入口我写了两个List的类型 class Program { static void Main(string[] args) { try { Console.WriteLine(typeof(Listint)); Console.WriteLine(typeof(Liststring)); 运行我们发现TList虽然在调用时不知道传的什么类型但是加了占位符那么占位符是什么那?我们从dos里面看到1对这个就是占位符。那么定位符是在什么时候声明的那上代码 class Program { static void Main(string[] args) { try { int iParameter 123; long lParameter 456; string sParameter abc; object oParameter 123456; Console.WriteLine(**********************); CommonClass.ShowInt(iParameter); CommonClass.ShowLong(lParameter); CommonClass.ShowString(sParameter); Console.WriteLine(**********************); CommonClass.ShowObject(oParameter); CommonClass.ShowObject(iParameter); CommonClass.ShowObject(lParameter); CommonClass.ShowObject(sParameter); Console.WriteLine(**********************); GenericClass.Showobject(oParameter); GenericClass.Showint(iParameter); //GenericClass.Showint(lParameter);//指定类型必须和参数一致 GenericClass.Show(iParameter);//不指定由编译器自动推算 GenericClass.Showlong(lParameter); GenericClass.Showstring(sParameter); Console.WriteLine(**********************); } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.Read(); } } } 这里我就不赘述了直接说一下吧其实泛型在声明的时候不知道什么类型用了占位符是在调用的时候编译器自动推算也可以在调用时指定这是一种延迟思想延迟声明把参数类型的声明延迟到调用的时候推迟一切可以推迟的这也是设计模式的一种思想。编译以后的泛型和普通方法就一样了所以不会影响性能可以想象成又一个重载 泛型的好处一个方法支持多种参数类型 性能无损耗。 泛型支持多个参数可想而知但是真的无损耗吗不清楚好对一切我们要持一种怀疑的态度去看科学的自然会被证实那么这里我们测试一下。用到类Stopwatch long commonTime 0; long objectTime 0; long genericTime 0; { Stopwatch watch new Stopwatch(); watch.Start(); for (int i 0; i 100000000; i) { CommonClass.ShowObject(iParameter); } watch.Stop(); objectTime watch.ElapsedMilliseconds; } { Stopwatch watch new Stopwatch(); watch.Start(); for (int i 0; i 100000000; i) { CommonClass.ShowInt(iParameter); } watch.Stop(); commonTime watch.ElapsedMilliseconds; } { Stopwatch watch new Stopwatch(); watch.Start(); for (int i 0; i 100000000; i) { GenericClass.Showint(iParameter); } watch.Stop(); genericTime watch.ElapsedMilliseconds; } Console.WriteLine(commonTime{0}, commonTime); Console.WriteLine(objectTime{0}, objectTime); Console.WriteLine(genericTime{0}, genericTime); 里面的三个类分别是object类型和普通类以及泛型分别对int、string以及实体类型的调用我直接上答案 通过图上给出的运行时间泛型是最快的然后是普通方法然后是object类型大家要知道我这是在运行1亿次的情况下的所得的结果其实我们还得出一个结论那就是object类型确实有性能影响单并不罪大恶极也不是不能用的也要看程序所处的环境。 补充一点泛型不是语法糖语法糖是编译器提供带的功能不要误解了 原文地址 http://www.cnblogs.com/renzhitian/p/6202917.html .NET社区新闻深度好文微信中搜索dotNET跨平台或扫描二维码关注