您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > C/C++/C#

C#笔记~泛型

时间:2020-08-26 10:41:29  来源:  作者:

一、引入泛型

在实际开发中,常常会出现重复代码的问题,例如。

C#笔记~泛型

 


C#笔记~泛型

运行结果

这里的三个方法,使用不同的类型干了同样的事情。作为一个有追求的程序员,是绝不允许这样的事情发生的。我们观察发现,这三个方法除了方法名称和参数类型不同,方法体一模一样。我们知道object类型是一切类型的基类,根据里氏替换原则,子类对象可以赋值给父类,也即是说,可以使用object类型替换具体的类型。于是有基类版本的通用方法,且看下图。

C#笔记~泛型

 


C#笔记~泛型

运行结果

代码重复的问题就这么轻松搞定,但是其中存在的问题却不容忽视。

1.对于值类型(这里的int),发生了装箱、拆箱问题,从栈Copy到堆,从堆写到栈,都是多余的操作,产生性能损耗

2.object类型是一切类型的基类,那么这个方法对所有类型都适用,这样容易引发类型安全问题。

那么,有没有一种方式,既可以解决代码重复问题,又可以避免出现上诉问题呢?

答案是:泛型。

二、什么是泛型

泛型让我们可以编写一个可以与任何数据类型一起工作的类或方法。可以简单地理解为:泛型是类型的模板。

泛型不是一种语法糖,而是.NetFramework 2.0推出的新语法,是框架升级支持的新功能。

三、声明和使用泛型

C#笔记~泛型

泛型方法


C#笔记~泛型

运行结果

泛型使用尖括号和泛型名称构成:<T>,使用时尖括号内的T需替换为实际类型,也可以不带尖括号而由类型推断判断实参的类型。

四、泛型原理

在声明泛型时,类型是未确定的,在调用泛型时,必须指定实际类型。这种在定义时未确定类型而使用时确定类型的方式,可以称为延迟声明。延迟声明体现了推迟一切可以推迟的设计思想。

C#笔记~泛型

 

五、性能比较

C#笔记~泛型

循环1亿次


C#笔记~泛型

运行结果

多次运行后发现,普通方法和泛型方法的耗时相差不大,而object方法因为装箱耗时是其他两种方法的倍数。

六、泛型类、泛型接口、泛型委托

前面我们讲解的都是泛型方法,其实除了泛型方法,还有泛型类、泛型接口、泛型委托。

C#笔记~泛型

泛型类


C#笔记~泛型

泛型接口


C#笔记~泛型

泛型委托

对于泛型类和泛型接口,如果其他类继承或实现了它,要求这个类必须指定具体的类型,或者不指定类型但此类也是泛型类。

七、泛型约束

在第六点我们已经使用了泛型约束,请看上图where部分。泛型约束是为类型安全而设计的,它有如下几种约束:

C#笔记~泛型

结构约束。值类型,必须在其他约束之前


C#笔记~泛型

类约束。引用类型,必须在其他类型约束之前


C#笔记~泛型

无参数构造函数约束。与其他约束使用时,必须放在最后


C#笔记~泛型

基类约束。基类或派生类,该基类必须是可继承的


C#笔记~泛型

接口约束。可以指定多个接口约束,类型必须实现该接口

八、协变(out)、逆变(in)

C#笔记~泛型

 

使用泛型之后,我们发现基类和子类的泛型并没有继承关系,但实际业务中,他们还是父子关系。

为解决上述问题,引入了协变、逆变。

1.协变,让赋值表达式右边可以用子类

协变只能修饰返回参数。为什么不能修饰传入参数呢?因为父类赋值给子类。

C#笔记~泛型

 


C#笔记~泛型

 

2.逆变,让赋值表达式右边可以用父类

逆变只能修饰传入参数。

C#笔记~泛型

 


C#笔记~泛型

 

3.协变逆变只能用于接口、委托。



Tags:C#   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
一、简介很多时候我们都需要用到一些验证的方法,有时候需要用正则表达式校验数据时,往往需要到网上找很久,结果找到的还不是很符合自己想要的。所以我把自己整理的校验帮助类分...【详细内容】
2021-12-27  Tags: C#  点击:(1)  评论:(0)  加入收藏
读取SQLite数据库,就是读取一个路径\\192.168.100.**\position\db.sqlite下的文件<startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0"/...【详细内容】
2021-12-16  Tags: C#  点击:(21)  评论:(0)  加入收藏
一文看懂"async"和“await”关键词是如何简化了C#中多线程的开发过程当我们使用需要长时间运行的方法(即,用于读取大文件或从网络下载大量资源)时,在同步的应用程序中,应用程序本...【详细内容】
2021-12-01  Tags: C#  点击:(23)  评论:(0)  加入收藏
OpenCV(Open Source Computer Vision Library)是一个(开源免费)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android、ios等操作系统上,它轻量级而且高效---由一系列...【详细内容】
2021-11-11  Tags: C#  点击:(50)  评论:(0)  加入收藏
在进行C#接口开发时经常需要将数据集转换成json返回,下面介绍一种将DataTable数据转换成实体类,然后再转换成json的方法。一、创建全病案类/// <summary> /// 全病案 //...【详细内容】
2021-11-04  Tags: C#  点击:(44)  评论:(0)  加入收藏
C# 获取网络路径文件大小信息的方法private void button1_Click(object sender, EventArgs e){label2.Text= GetInfo(textBox1.Text);}private string GetInfo(string URL){...【详细内容】
2021-10-29  Tags: C#  点击:(52)  评论:(0)  加入收藏
现如今二维码广泛应用,已经成为了生活中不可或缺的东西;所以我们日常的开发中,也少不了对二维码的生成或者解析。此文讲述一下使用C# 生成和解析二维码 实现功能:将字符串生成二...【详细内容】
2021-10-21  Tags: C#  点击:(58)  评论:(0)  加入收藏
最开始接触.net大概是2003年,当时用的还是framework1.1,那是CAM项目,使用.net主要是利用RemotingService做分布式开发,我当时做其中的一个子系统,因为之前一直都是C++开发,对C#一...【详细内容】
2021-08-17  Tags: C#  点击:(102)  评论:(0)  加入收藏
最近想自己做个录屏工具玩玩,使用的是ffmpeg,录屏是没有问题,在取麦克风及电脑声卡遇到了难题,ffmpeg也可以获取到设备名称但是没办法解析 ( 指令:ffmpeg -list_devices true -f d...【详细内容】
2021-08-04  Tags: C#  点击:(277)  评论:(0)  加入收藏
在实际的项目开发中,可能需要考虑代码的安全性或执行效率,需要将具体的功能实现隐藏,dll接口提供了很好的解决方案。dll接口不仅在C++的项目中可以直接调用,在C#开发的项目也同...【详细内容】
2021-07-09  Tags: C#  点击:(122)  评论:(0)  加入收藏
▌简易百科推荐
一、简介很多时候我们都需要用到一些验证的方法,有时候需要用正则表达式校验数据时,往往需要到网上找很久,结果找到的还不是很符合自己想要的。所以我把自己整理的校验帮助类分...【详细内容】
2021-12-27  中年农码工    Tags:C#   点击:(1)  评论:(0)  加入收藏
引言在学习C语言或者其他编程语言的时候,我们编写的一个程序代码,基本都是在屏幕上打印出 hello world ,开始步入编程世(深)界(坑)的。C 语言版本的 hello world 代码:#include <std...【详细内容】
2021-12-21  一起学嵌入式    Tags:C 语言   点击:(10)  评论:(0)  加入收藏
读取SQLite数据库,就是读取一个路径\\192.168.100.**\position\db.sqlite下的文件<startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0"/...【详细内容】
2021-12-16  今朝我的奋斗    Tags:c#   点击:(21)  评论:(0)  加入收藏
什么是shellshell是c语言编写的程序,它在用户和操作系统之间架起了一座桥梁,用户可以通过这个桥梁访问操作系统内核服务。 它既是一种命令语言,同时也是一种程序设计语言,你可以...【详细内容】
2021-12-16  梦回故里归来    Tags:shell脚本   点击:(16)  评论:(0)  加入收藏
一、编程语言1.根据熟悉的语言,谈谈两种语言的区别?主要浅谈下C/C++和PHP语言的区别:1)PHP弱类型语言,一种脚本语言,对数据的类型不要求过多,较多的应用于Web应用开发,现在好多互...【详细内容】
2021-12-15  linux上的码农    Tags:c/c++   点击:(17)  评论:(0)  加入收藏
1.字符串数组+初始化char s1[]="array"; //字符数组char s2[6]="array"; //数组长度=字符串长度+1,因为字符串末尾会自动添&lsquo;\0&lsquo;printf("%s,%c\n",s1,s2[2]);...【详细内容】
2021-12-08  灯-灯灯    Tags:C语言   点击:(46)  评论:(0)  加入收藏
函数调用约定(Calling Convention),是一个重要的基础概念,用来规定调用者和被调用者是如何传递参数的,既调用者如何将参数按照什么样的规范传递给被调用者。在参数传递中,有两个很...【详细内容】
2021-11-30  小智雅汇    Tags:函数   点击:(19)  评论:(0)  加入收藏
一、问题提出问题:把m个苹果放入n个盘子中,允许有的盘子为空,共有多少种方法?注:5,1,1和1 5 1属同一种方法m,n均小于10二、算法分析设f(m,n) 为m个苹果,n个盘子的放法数目,则先对...【详细内容】
2021-11-17  C语言编程    Tags:C语言   点击:(46)  评论:(0)  加入收藏
一、为什么需要使用内存池在C/C++中我们通常使用malloc,free或new,delete来动态分配内存。一方面,因为这些函数涉及到了系统调用,所以频繁的调用必然会导致程序性能的损耗;另一...【详细内容】
2021-11-17  深度Linux    Tags:C++   点击:(37)  评论:(0)  加入收藏
OpenCV(Open Source Computer Vision Library)是一个(开源免费)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android、ios等操作系统上,它轻量级而且高效---由一系列...【详细内容】
2021-11-11  zls315    Tags:C#   点击:(50)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条