谈一谈泛型(Generic)
谈一谈泛型
首先,泛型是C#2出现的。这也是C#2 一个重要的新特性。泛型的好处之一就是在编译时执行更多的检查。
泛型类型和类型参数
泛型的两种形式:泛型类型( 包括类、接口、委托和结构 没有泛型枚举)
下面以Dictionary<TKey,TValue> 来为例,解释一下类型参数,类型实参(type argument),开放类型,封闭类型
上面的例子中,
- 类型参数是
TKey和TValue。 - 在使用泛型类型或方法时,要用真实的类型代替,比如
Dictionary<string,int>,那么类型实参就是string和int。 - 如果没有为泛型参数提供类型实参,那么这就是一个
未绑定泛型类型(unbound generic type),如果指定了实参,该类型就称为一个已构造类型(constructed type) - 已构造类型可以是开放类型(open type)或封闭类型(closed type),开放类型 还包含一个类型参数(例如这样
Dictionary<T,int>),而封闭类型就像这样Dictionary<string,int>。
PS:我觉得吧,记住一些专业术语还是很重要的。比如泛型(
Generic),实参(argument)和形参(parameter)以及上面的一些专业术语,因为当你在使用 Google or Stackoverflow时,别到时知道问题但是你输入不来关键字。还有List<T>读作List of T
接下来谈谈类型约束(Type Constraint)与类型推断(Type Inference)。
首先是 类型约束,主要有四种约束(Constraint)可供使用,约束要放到泛型方法或泛型类型声明的末尾,并由上下文关键字Where 来引入。
主要有以下四种约束分别是,引用类型约束、值类型约束、构造函数类型约束、转换类型约束。
引用类型约束主要确保使用的类型实参是引用类型 由
T:Class表示,并且必须是类型参数指定的第一个约束。struct RefSample<T> where T : class比如
RefSample<string>其类型实参是引用类型,但是RefSample<string>仍然是值类型。值类型约束示例声明如下
class ValSample<T> where T : struct构造函数类型约束表示为
T: new(),并且必须是所有类型参数的最后一个约束。转换类型约束允许你指定另一个类型,类型实参必须可以通过一致性、引用、或者装箱隐式地转换为该类型。这里就引出了另一个名词 类型参数约束(
type parameter constraint)最后约束一般都是组合起来使用的,下面就是组合约束时需要注意的一些事项。
- 不能既是引用类型又是值类型
- 如果已经有一个值类型约束,就不允许再指定一个构造函数约束(但如果,
T被约束成一个值类型,仍可以方法内部使用new T()) - 如果存在多个转换类型约束,并且其中一个为类,那么它应该出现在接口的前面,而且我们不能多吃指定同一个接口。
接下来展示几个有效的和无效的例子
class Sample<T> where T : class, IDisposable, new () is Valid
class Sample<T,U> where T : Stream where U : IDisposable is valid class Sample<T> where T : class, struct is invalid
class Sample<T,U> where T : Stream, U : IDisposable is invalid
泛型比较接口 :
IComparer<T>和IComparable<T>用于排序(判断猴哥值是小于、等于、还是大于另一个值),而IEqualityComparer<T>和IEquatable<T>通过某种标准来比较两个项的相等性,或查找某个列的散列。
可变性 分为 协变性和逆变性,在C#4.0 之前,泛型是不支持可变性的,之后的话,就出现了 out 和 in。
谈一谈泛型(Generic)的更多相关文章
- 谈一谈从 Delphi 2009 之后就支援的重要功能 – 泛型 (Generic)
前言 在C++的语言基础当中,除了物件导向.事件驱动的概念之外,模版设计(Template)也是非常重要的一环.然而,C++的开发人员能够善用模版设计的并不多.模版设计这个好物,一般还有一个名称,就是 ...
- 谈一谈C#的事件
谈一谈C#的事件 C#中事件基于委托,要理解事件要先理解委托,如果觉得自己关于委托不是很了解可以看看我前面写委托的文章 事件基于委托,是一种功能受限的委托,为委托提供了一种发布/订阅机制 使用委托时, ...
- Java - 泛型 ( Generic )
Java - 泛型 ( Generic ) > 泛型的特点 > 解决元素存储的安全性问题 > 解决获取数据元素时,需要类型强转的问题 ...
- 谈一谈Java8的函数式编程(二) --Java8中的流
流与集合 众所周知,日常开发与操作中涉及到集合的操作相当频繁,而java中对于集合的操作又是相当麻烦.这里你可能就有疑问了,我感觉平常开发的时候操作集合时不麻烦呀?那下面我们从一个例子说起. 计 ...
- Java之集合初探(二)Iterator(迭代器),collections,打包/解包(装箱拆箱),泛型(Generic),comparable接口
Iterator(迭代器) 所有实现了Collection接口的容器都有一个iterator方法, 用来返回一个实现了Iterator接口的对象 Iterator对象称作迭代器, 用来方便的实现对容器 ...
- 从一张图开始,谈一谈.NET Core和前后端技术的演进之路
从一张图开始,谈一谈.NET Core和前后端技术的演进之路 邹溪源,李文强,来自长沙.NET技术社区 一张图 2019年3月10日,在长沙.NET 技术社区组织的技术沙龙<.NET Core和 ...
- 谈一谈Elasticsearch的集群部署
Elasticsearch天生就支持分布式部署,通过集群部署可以提高系统的可用性.本文重点谈一谈Elasticsearch的集群节点相关问题,搞清楚这些是进行Elasticsearch集群部署和拓 ...
- 谈一谈iOS事件的产生和传递
谈一谈iOS事件的产生和传递 1.事件的产生 发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中. UIApplication会从事件队列中取出最前面的事件,并将事件 ...
- 谈一谈对MySQL InnoDB的认识及数据库事物处理的隔离级别
介绍: InnoDB引擎是MySQL数据库的一个重要的存储引擎,和其他存储引擎相比,InnoDB引擎的优点是支持兼容ACID的事务(类似于PostgreSQL),以及参数完整性(有外键)等.现在Inn ...
随机推荐
- java中<> 的用法
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Java语言引 ...
- R语言基础2
----------------------------------R语言学习与科研应用,科研作图,数据统计挖掘分析,群:719954246-------------------------- 通常, ...
- 使用Google 的 gson方式解析json
gson支持解析的类型还是比较全面的,包括JavaBean,List<JavaBean>,List<String>,Map等,使用起来也是比较方便,下面根据代码示例给出总结: ...
- 【bug清除】新Surface Pro使用OneNote出现毛刺现象的解决方案
在写字的时候,左手触摸Surface的金属外壳背面,大概两个手指指肚大小.问题亲测可以得到解决. 推测是设备使用时接地没有做好,导致电磁笔出现偏移.问题初步锁定在新笔的倾斜感应上. 参考资料: htt ...
- python+flask 分分钟完美解析阿里云日志
拿到了自己阿里云服务器的日志,对其需要进行处理. class Read_Rizhi: def __init__(self,filename): self.filename=filename def o ...
- 第一次制作和使用图标字体-IcoMoon
开题:之前就有所耳闻,最近两天第一次运用到图标字体.刚开始嘛,一脸懵逼的状态.成功运用之后就来记录一下使用过程咯! 1. 打开在线生成工具:https://icomoon.io/app/#/selec ...
- 使用JavaScript实现一个俄罗斯方块
清明假期期间,闲的无聊,就做了一个小游戏玩玩,目前游戏逻辑上暂未发现bug,只不过样子稍微丑了一些-.-项目地址:https://github.com/Jiasm/tetris在线Demo:http: ...
- 解决IE8下opacity属性失效问题
由于opacity属性存在兼容性问题,所以在IE8下,用opacity来设置元素的透明度,会失效,从而导致页面的样式问题. 在IE8及其更早的浏览器下,我们可以使用filter属性,来代替opacit ...
- 【漏洞复现】PHPCMS wap模块 SQL注入(附EXP)
漏洞影响版本:v9.5.8.v9.6.0 Step1: 访问:http://www.xxx.com/index.php?m=wap&a=index&siteid=1, 获取返回的coo ...
- python入门(12)dict
python入门(12)dict Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度. 举个例 ...