泛型(generic)是C#语言2.0和通用语言运行时(CLR)的一个新特性。泛型为.NET框架引入了类型参数(type parameters)的概念。类型参数使得设计类和方法时,不必确定一个或多个具体参数,其的具体参数可延迟到客户代码中声明、实现。这意味着使用泛型的类型参数T,写一个类MyList,客户代码可以这样调用:MyList, MyList或 MyList。这避免了运行时类型转换或装箱操作的代价和风险。


以前类型的泛化(generalization)是靠类型与全局基类System.Object的相互转换来实现。

  • 如果这些元素是值类型,那么当加入到列表中时,它们必须被装箱;当重新取回它们时,要拆箱。类型转换和装箱、拆箱的操作都降低了性能;
  • 另一个局限是缺乏编译时的类型检查,当一个ArrayList把任何类型都转换为Object,就无法在编译时预防客户代码错误,而这个错误直到运行的时候才会被发现。

泛型的性能测试:

//普通方法、Object方法、Generic方法
public class GenericMethodTest
{/// <summary>/// 打印个int值/// </summary>/// <param name="iParameter"></param>public static void ShowInt(int iParameter){int _Int1 = iParameter;}/// <summary>/// 打印个string值/// </summary>/// <param name="sParameter"></param>public static void ShowString(string sParameter){string _Str1 = sParameter;}/// <summary>/// 打印个object值/// 1 任何父类出现的地方,都可以使用子类来替换/// 2 object是一切类型的父类/// </summary>/// <param name="oParameter"></param>public static void ShowObject(object oParameter){int intO = (int)oParameter;}/// <summary>/// 延迟声明:把参数类型的声明推迟到调用/// </summary>/// <typeparam name="T"></typeparam>/// <param name="tParameter"></param>public static void ShowGeneric<T>(T tParameter){T intT = tParameter;}
}
//控制台测试代码:
class Program
{static void Main(string[] args){SafeInvoke(() =>{//通过委托实现通用的异常处理Stopwatch sw = new Stopwatch();sw.Start(); for (int i = 0; i < 100000000; i++){GenericMethodTest.ShowInt(1);}sw.Stop();TimeSpan ts1 = sw.Elapsed;Console.WriteLine("ShowInt总共花费{0}ms.", ts1.TotalMilliseconds);Stopwatch sw1 = new Stopwatch();sw1.Start(); for (int i = 0; i < 100000000; i++){GenericMethodTest.ShowString("test");}sw1.Stop();TimeSpan ts2 = sw1.Elapsed;Console.WriteLine("ShowString总共花费{0}ms.", ts2.TotalMilliseconds);Stopwatch sw2 = new Stopwatch();sw2.Start(); for (int i = 0; i < 100000000; i++){GenericMethodTest.ShowObject(1);}sw2.Stop();TimeSpan ts3 = sw2.Elapsed;Console.WriteLine("ShowObject总共花费{0}ms.", ts3.TotalMilliseconds);Stopwatch sw3 = new Stopwatch();sw3.Start(); for (int i = 0; i < 100000000; i++){GenericMethodTest.ShowGeneric<int>(1);}sw3.Stop();TimeSpan ts4 = sw3.Elapsed;Console.WriteLine("ShowGeneric总共花费{0}ms.", ts4.TotalMilliseconds);});}/// <summary>/// 通用的异常处理/// </summary>/// <param name="act">对应任何的逻辑</param>public static void SafeInvoke(Action act){try{act.Invoke();}catch (Exception ex)//按异常类型区分处理{Console.WriteLine(ex.Message);}}
}


测试会发现泛型的速度居然比普通的方法耗时还会少一点,那么我们对于一系列的不同对象需要做相同的操作的时候我们是否可以考虑用泛型来实现呢?


在泛型类型或泛型方法的定义中,类型参数是一个占位符(placeholder),那么带来的一个问题是:编译器并不知道这个占位符类型T到底是什么对象,可以调用哪些方法,因此无约束的泛型方法所可以调用的方法就很少。因此就需要引入另一个话题:以约束换权利

同一个类型参数可应用多个约束。约束自身也可以是泛型类,如下:
class MyList<T> where T: Employee, IEmployee,  IComparable<T>,  new()
{…}
下表列出了五类约束:
约束       描述
where T: struct 类型参数必须为值类型。
where T : class 类型参数必须为引用类型。
where T : new() 类型参数必须有一个公有、无参的构造函数。当于其它约束联合使用时,new()约束必须放在最后。
where T : <base class name> 类型参数必须是指定的基类型或是派生自指定的基类型。
where T : <interface name>  类型参数必须是指定的接口或是指定接口的实现。可以指定多个接口约束。接口约束也可以是泛型的。

应用:以父类或接口来约束泛型,调用泛型方法时传入不同的子类,同时还能使用其共同拥有的方法。

c#泛型的使用性能测试相关推荐

  1. 理解C#泛型运作原理

    前言  我们都知道泛型在C#的重要性,泛型是OOP语言中三大特征的多态的最重要的体现,几乎泛型撑起了整个.NET框架,在讲泛型之前,我们可以抛出一个问题,我们现在需要一个可扩容的数组类,且满足所有类型 ...

  2. 性能测试小总结(四) 结果分析(未完成)

    结果分析 seleniumSelenium与QTP的比较 https://www.jianshu.com/p/593736bd44b3 Selenium web应用程序测试工具 功能 框架底层使用Ja ...

  3. Jackson将json字符串转换成泛型List

    2019独角兽企业重金招聘Python工程师标准>>> Jackson,我感觉是在Java与Json之间相互转换的最快速的框架,当然Google的Gson也很不错,但是参照网上有人的 ...

  4. 性能测试分析软件汇总–开源、商业全部收集

    转载地址 https://my.oschina.net/zlp5201/blog/530290 本文共包含:商业性能测试.监控.分析工具和免费.开源性能测试监控分析工具:共涉及java.php.net ...

  5. web版本 开源压测工具_14款好用开源的Web应用压力负载,性能测试工具推荐

    JMeter JMeter是Apache组织的开放源代码项目,它是功能和性能测试的工具,100%的用java实现. Grinder Grinder是一个负载测试框架,通过Jython来编写测试脚本,基 ...

  6. C# 泛型约束 new() 的底层细节和性能

    注意:本文不会讲泛型如何使用,关于泛型的概念和泛型约束的使用请微软官方参考链接. https://docs.microsoft.com/zh-cn/dotnet/csharp/language-ref ...

  7. python 正则化表达式和泛型函数的使用及异常

    目录 一.正则表达式 3.1匹配函数 3.2检索和替换 3.3正则表达式对象 二.常用方法使用 三.泛型函数的使用 四.上下文管理器 五.装饰器 六.异常 6.1抛出和捕获异常 一.正则表达式 正则表 ...

  8. 【C#】集合_哈希表_字典_泛型_文件

    数组能做到:存放同种类型数据,且数据个数确定 object类型的数组能满足:放各种类型的数据,确定放多少个,但是随意插入元素,数组做不到 集合能做到:存放各种数据类型,且不确定存放多少个,能做到随意插 ...

  9. 2021年大数据常用语言Scala(三十六):scala高级用法 泛型

    目录 泛型 定义一个泛型方法 定义一个泛型类 上下界 协变.逆变.非变 非变 协变 逆变 泛型 scala和Java一样,类和特质.方法都可以支持泛型.我们在学习集合的时候,一般都会涉及到泛型. sc ...

最新文章

  1. Java方法,调用,static关键字
  2. Tries and Ternary Search Trees in Python and Javascript
  3. Nginx —— nginx的命令行控制(nginx的启动与停止、重载配置文件、回滚日志文件、平滑升级等操作)
  4. Wiki系统分析比较
  5. 中国水环境治理市场需求前景与十四五战略规划建议报告2022版
  6. PMCAFF原创作者人气榜,快来看看你排第几?
  7. python字符串换行连接_零基础学python_03_字符串(拼接+换行+制表符)
  8. 使用Redis的简单消息队列
  9. Linux下查看/管理当前登录用户及用户操作历史记录
  10. kafka 如何做到1秒发布百万级条消息?
  11. 【来自项目的技术点】— 聊聊键盘长按的时候解决卡顿方案
  12. Python学习之OS模块初识
  13. 42. Understand the two meanings of typename.
  14. matlab下载安装全教程
  15. 将转为时间戳php,php将时间转化为时间戳的方法
  16. 玩转iOS开发:iOS 8新特性《Share Extension》
  17. 中国的省市自治区及下属县镇
  18. 3.2【微信小程序全栈开发课程】登录功能(一)--实现登录功能
  19. 电话拨键号码(DTMF信号)识别
  20. 物联网专业本科毕业论文选题

热门文章

  1. vue锚链接可以从指定位置显示么_onenote链接系列⑥:链接笔记如何产生?与插入链接的区别...
  2. linux使用date命令修改系统日期,使用date命令设置CentOS Linux修改系统日期和时间...
  3. qtableview选中第一行时表头会变色_超新颖的Word目录制作法,包你一看就会!【Word教程】...
  4. can通道采样频率_关于CAN通信速率设置
  5. php取数组里面数组的值,PHP获取数组的键与值方法小结
  6. 深度学习数据集制作_一篇文章搞定人工智能之深度学习创建训练数据集的方法
  7. 去除残缺条目java_为什么说Java匿名内部类是残缺的闭包
  8. git使用git push 命令跳出remote: Permission to Aname denied to usernameB 的问题
  9. 第一行代码 Android (郭霖 著)
  10. PC值=当前程序执行位置+8