.NET 泛型,详细介绍
今天的文章是因为再给一个朋友讲这个的时候随手记录下整理出来的。说白了就是把前辈们曾经给我吹过的我又吹了出去。
泛型:是C# FrameWork 2.0 时代 加入进来的,可以说对与Net开发人员来说泛型是无处不再的,喜欢看源码的同学,可能会有发现,包括MVC里面基本上也是有很多发泛型,还有很多设计模式也需要搭配泛型来实现,包括项目架构
泛型的存在,是代码利用率复用性都大大的提升了,有时候Object 也是可以起到相同的作用,为什么使用泛型 为什么不是用Obj ,我们来看一下:
下面我们列出两个最基础的方法:
/// <summary>/// 返回int/// </summary>/// <param name="I"></param>/// <returns></returns>public int ShowInt(int I) {return I; }/// <summary>/// 返回String/// </summary>/// <param name="I"></param>/// <returns></returns>public string ShowString (string I) {return I; }
上面的两个方法自从参数 进来到参数出去的这一个过程中我们没有进行参数方面的转换,也就是说单纯的针对的参数类型上面我们程序代码是没有损失任何的性能的。一位没有存在拆箱装箱的过程。
我们在看两个方法:我们使用了在C# 1.0 时代就存在的一个类型 是Object
/// <summary>/// 返回int/// </summary>/// <param name="I"></param>/// <returns></returns>public int ShowString(object I) {return Convert.ToInt32(I); }/// <summary>/// 返回String/// </summary>/// <param name="I"></param>/// <returns></returns>public string ShowString(object I) {return I.ToString(); }
这里我们使用的阐述类型是Obj ,Object 是引用类型,也是所有类型的父类,可以包容所有的类型,但是就单说处理参数类型的时候我们需要去转换一下才能进行使用,在这个转换的过程中我们已经损失了性能,但是使用Obj 的时候我们可以和成一个方法减少代码量,提升了代码的复用率。
比如:
/// <summary>/// 返回object/// </summary>/// <param name="I"></param>/// <returns></returns>public object ShowType(object I) {return I; }
现在简写成为这样后,我们是一个公用的方法:虽然说内部不用去转换了但是,在调用后,还是需要类型的转换同样的需要损失性能。中间性能之所以会损失是因为Obj是引用类型,存放在堆上的,假如说我们传的参数是int或其他的值类型来使用我们的公共方法,就会进行一次包装的过程,把存放在栈里面的值类型移动包装成为引用类型存放到堆里面,使参数符合当前方法的类型,这个过成也就是装箱(需要重新分配内存),但是我们在使用的时候,又需要把他拿出来进行一下装换转换为值类型,这个过程又称为拆箱,
我们在来使用一个方法:使用 2.0时代出现的泛型:
/// <summary>/// 返回 T/// </summary>/// <param name="Parameter"></param>/// <returns></returns>public T Show<s>(T Parameter) {return Parameter; }
为什么会使用泛型 是因为泛型方法再调用的时候有延时声明的功能这里的延时声明式只参数,泛型里面的 T ,其实咱们也可以理解为 占位符具体为谁占位的,等到调用的时候才会知道。
如下:
int parameter = 0;//在调用的时候声明参数类型 parameter = new Common().Show<int>(parameter);//如果调用的时候不去声明的话,JIT编译的时候野会帮我们自动计算
parameter = new Common().Show(parameter);
这个时候不会损耗什么性能。延时声明也是咱们在进行框架设计的时候常用的一种思想,提高框架的性能。泛型不只是可以声明泛型方法:
泛型类:
/// <summary>/// CURD 操作类/// </summary>/// <typeparam name="T"></typeparam>public class ConmonClass<T> {public void Add(T s) { };public void Update(T s) { };public void Del(T s) { };public void Select(T s) { }; }
这样使用的话,在咱们真正的项目,我们可以把某些基础的操作用一个类去搞定,使用的时候调用就是了,减少代码的冗余,增加复用性,重用率。
泛型接口:
/// <summary>/// CURD 操作接口类/// </summary>/// <typeparam name="T"></typeparam>public interface ConmonInterface<T> { T Add(T s); T Update(T s); T Del(T s); T Select(T s); }
泛型委托:
//泛型委托public delegate T GetHandler<T>();
我想以上的操作在我们开发项目的时候会经常见到,或使用到
以上代码需要我们注意的时候,泛型类不能被继承,如果想要继承的话需要在继承的时候,给我们的不确定参数确定下参数类型。包括泛型接口也是一样的。
如下:
public class Son : ConmonClass<Common> {};/// <summary>/// 实现泛型接口/// </summary>public class SonInterface : ConmonInterface<Common> {public Common Add(Common s) {throw new NotImplementedException(); } public Common Del(Common s) {throw new NotImplementedException(); } public Common Select(Common s) {throw new NotImplementedException(); } public Common Update(Common s) {throw new NotImplementedException(); } }
如果说不指定泛型类型的参数类型式其实我们一样是可以继承的。需用继承者同样是泛型的。
建议:长期使用Net的同学我想我们需要加强一下泛型的认识了,因为在NetCore中常常会使用依赖注入,在使用泛型类的时候我们可能会多少有点麻烦的,泛型方法相对来说要简单的,如果说要想让我们的框架实现高度的内聚,大家需要多多理解。
泛型的约束,多重约束相当重要,代表我们是否能很好的利用泛型。
泛型的约束类型大概分为如下几种:
引用类型约束: |
表明泛型参数只能是引用类型的: |
值类型约束: |
表明泛型参数只能是值类型的: |
无参数构造函数约束: |
泛型是可以实例化的。 |
基类约束 |
必须满足基类中的某些属性 |
接口约束 |
必须满足接口中的某些属性 |
具体的就不代码了。
原文地址:https://www.cnblogs.com/szlblog/p/10703770.html
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
.NET 泛型,详细介绍相关推荐
- java中的泛型是什么_Java中泛型是什么?Java泛型的详细介绍
本篇文章给大家带来的内容是关于Java中泛型是什么?Java泛型的详细介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一.什么是泛型? Java泛型设计原则:只要在编译时期没有出 ...
- java的annotation_Java Annotation认知(包括框架图、详细介绍、示例说明)
摘要 Java Annotation是JDK5.0引入的一种注释机制. 网上很多关于Java Annotation的文章,看得人眼花缭乱.Java Annotation本来很简单的,结果说的人没说清楚 ...
- Java Annotation认知(包括框架图、详细介绍、示例说明)
摘要 Java Annotation是JDK5.0引入的一种注释机制. 网上很多关于Java Annotation的文章,看得人眼花缭乱.Java Annotation本来很简单的,结果说的人没说清楚 ...
- java输出set集合元素_java Set集合,HashSet类详细介绍
下面要给大家介绍的就是java Set集合方面的内容,本文主要讲到了HashSet类的一些知识,主要包括了HashSet类的特点,HashSet 类的常用构造方法重载形式以及代码演示了创建两种不同形式 ...
- Scala语言超详细介绍(上)
Scala语言 1.为什么要学习scala? 2.scala的介绍 3.scala语言和Java语言对比 4.编译工具的安装 5.main方法讲解 6. scala中的数据数据类型 7. 懒加载 8. ...
- Java泛型使用介绍
Java泛型介绍 1.为什么要使用泛型 2.泛型使用方法 2.1在类中使用范型 2.2 泛型的通配符 3.泛型擦除 3.1 编译过程进行泛型擦除 3.2泛型的检查 3.3 在泛型类中不能new出泛型的 ...
- HTML页面加载和解析流程详细介绍
浏览器加载和渲染html的顺序.如何加快HTML页面加载速度.HTML页面加载和解析流程等等,在本文将为大家详细介绍下,感兴趣的朋友不要错过 浏览器加载和渲染html的顺序 1. IE下载的顺序是从上 ...
- mysql为什么要压测_mysql集群压测的详细介绍
本篇文章给大家带来的内容是关于mysql集群压测的详细介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. mysql压测 mysql自带就有一个叫mysqlslap的压力测试工具,通 ...
- php比较运算符案列,PHP实例:PHP比较运算符的详细介绍
<PHP实例:PHP比较运算符的详细介绍>要点: 本文介绍了PHP实例:PHP比较运算符的详细介绍,希望对您有用.如果有疑问,可以联系我们. 比拟运算符种类 PHP实战如同它们名称所暗示的 ...
- Tempdb数据库详细介绍
Tempdb数据库详细介绍 一.Tempdb简介 tempdb是SQLServer的系统数据库一直都是SQLServer的重要组成部分,用来存储临时对象.可以简单理解tempdb是SQLServer的 ...
最新文章
- Spring注解创建Bean的几种方式
- 深度学习-Tensorflow2基础知识
- 11、修改和删除索引(DROP INDEX)
- Qt 操作words实例 --- 幼儿快算题生成器
- 代码 抠图_067,我学会了用代码来抠图
- 迁移.NET 1.0 应用到FX 2.0 –.NET评测网的工具箱
- 计算机网络基础期中测试题,计算机网络基础期末考试试题
- @javax.inject.Inject,新的注入依赖规范
- [译] 关于CSS中的float和position (父容器div内的子元素div为float时,父元素无法撑开(或高度自适应)的解决方式)
- Python生成特定风格的配色组合
- Nginx双机热备实现方案(双主热备模式)
- 实习成长:logback收集项目日志,实现日志告警机器人
- Nature命名规范
- 如何将IP地址批量改变为城域网的IP地址
- 河北等保测评机构项目测评收费价格标准参考
- html几个重要标签用法(div,p,span,ul,li,dl,dt,dd,a,img,h,strong,em)
- 北理计算机优营会被鸽吗,被放鸽子以后~
- 最小均方算法二分类(基于双月数据集)
- 分享 10 个高星的创意项目!
- NameNode故障处理方法
热门文章
- chrome自动退出的原因_Chrome 70将让用户选择退出新的自动登录功能
- 荣耀9igoogle模式_iGoogle个性化主页的6种替代方法
- libreoffice_如何更改您在LibreOffice中可以撤消的操作数
- sfm点云代码_VisualSFM使用方法与心得
- 拒绝“高冷”词汇!初学C#中的委托
- python 蓝牙模块pybluz安装
- 深入分析Volatile的实现原理
- Serializable和Parcelable
- 三分钟总览微软任务并行库TPL
- 我计划搞直播了,欢迎来一起聊一聊