谈一谈泛型

首先,泛型是C#2出现的。这也是C#2 一个重要的新特性。泛型的好处之一就是在编译时执行更多的检查。

泛型类型和类型参数

​ 泛型的两种形式:泛型类型( 包括类、接口、委托和结构 没有泛型枚举

下面以Dictionary<TKey,TValue> 来为例,解释一下类型参数类型实参(type argument)开放类型封闭类型

上面的例子中,

  • 类型参数是 TKeyTValue
  • 在使用泛型类型或方法时,要用真实的类型代替,比如 Dictionary<string,int>,那么类型实参就是 stringint
  • 如果没有为泛型参数提供类型实参,那么这就是一个未绑定泛型类型(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 之前,泛型是不支持可变性的,之后的话,就出现了 outin

谈一谈泛型(Generic)的更多相关文章

  1. 谈一谈从 Delphi 2009 之后就支援的重要功能 – 泛型 (Generic)

    前言 在C++的语言基础当中,除了物件导向.事件驱动的概念之外,模版设计(Template)也是非常重要的一环.然而,C++的开发人员能够善用模版设计的并不多.模版设计这个好物,一般还有一个名称,就是 ...

  2. 谈一谈C#的事件

    谈一谈C#的事件 C#中事件基于委托,要理解事件要先理解委托,如果觉得自己关于委托不是很了解可以看看我前面写委托的文章 事件基于委托,是一种功能受限的委托,为委托提供了一种发布/订阅机制 使用委托时, ...

  3. Java - 泛型 ( Generic )

    Java - 泛型 ( Generic )     > 泛型的特点         > 解决元素存储的安全性问题         > 解决获取数据元素时,需要类型强转的问题     ...

  4. 谈一谈Java8的函数式编程(二) --Java8中的流

    流与集合    众所周知,日常开发与操作中涉及到集合的操作相当频繁,而java中对于集合的操作又是相当麻烦.这里你可能就有疑问了,我感觉平常开发的时候操作集合时不麻烦呀?那下面我们从一个例子说起. 计 ...

  5. Java之集合初探(二)Iterator(迭代器),collections,打包/解包(装箱拆箱),泛型(Generic),comparable接口

    Iterator(迭代器) 所有实现了Collection接口的容器都有一个iterator方法, 用来返回一个实现了Iterator接口的对象 Iterator对象称作迭代器, 用来方便的实现对容器 ...

  6. 从一张图开始,谈一谈.NET Core和前后端技术的演进之路

    从一张图开始,谈一谈.NET Core和前后端技术的演进之路 邹溪源,李文强,来自长沙.NET技术社区 一张图 2019年3月10日,在长沙.NET 技术社区组织的技术沙龙<.NET Core和 ...

  7. 谈一谈Elasticsearch的集群部署

      Elasticsearch天生就支持分布式部署,通过集群部署可以提高系统的可用性.本文重点谈一谈Elasticsearch的集群节点相关问题,搞清楚这些是进行Elasticsearch集群部署和拓 ...

  8. 谈一谈iOS事件的产生和传递

    谈一谈iOS事件的产生和传递 1.事件的产生 发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中. UIApplication会从事件队列中取出最前面的事件,并将事件 ...

  9. 谈一谈对MySQL InnoDB的认识及数据库事物处理的隔离级别

    介绍: InnoDB引擎是MySQL数据库的一个重要的存储引擎,和其他存储引擎相比,InnoDB引擎的优点是支持兼容ACID的事务(类似于PostgreSQL),以及参数完整性(有外键)等.现在Inn ...

随机推荐

  1. Django学习(六)---博客文章页面的超链接设置

    Django中的超链接 超链接的目标地址 href后面是目标地址 template中可以用 {% url  'app_name : url_name'   param %} app_name:应用命名 ...

  2. 工作流Activiti5.13学习笔记(一)

    了解工作流 1.工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档.信息或任务的过程自动进行,从而实现某 ...

  3. Java连接mysql——Establishing SSL connection without server's identity verification is not recommended.

    Establishing SSL connection without server's identity verification is not recommended. 出现这个错误的原因是因为m ...

  4. Beta总结

    45°炸 031502601 蔡鸿杰 031502604 陈甘霖 031502632 伍晨薇 一.写在Beta项目前 Beta 凡 事 预 则 立 二.GitHub传送门 Beta冲刺重要版本 三.用 ...

  5. Alpha冲刺No.10

    一.站立式会议 我们的阿尔法冲刺也基本宣告血崩,虽然很多功能已经实现,但是并没有串联在一起,好在这周不需要上课,我们也能好好睡一觉 实现手机的定位系统 细化界面设计 解决数据库和软件交互的一些问题 二 ...

  6. 敏捷冲刺每日报告——Day3

    1.情况简述 Alpha阶段第一次Scrum Meeting 敏捷开发起止时间 2017.10.27 00:00 -- 2017.10.28 00:00 讨论时间地点 2017.10.27晚9:30, ...

  7. 个人作业2——NBA 2k18案例分析

    产品:篮球体育类游戏NBA 2k18 选择理由:这款游戏是<NBA 2k>的正统续作,自己和身边的朋友都对篮球比较感兴趣,经常看NBA,所以近几年的版本都有购买下载,加上游戏中人物动作比较 ...

  8. iOS开发之Objective-C与JavaScript的交互

    UIWebView是iOS最常用的SDK之一,它有一个stringByEvaluatingJavaScriptFromString方法可以将javascript嵌入页面中,通过这个方法我们可以在iOS ...

  9. RxSwift 函数响应式编程

    Max 在 Boston 上学,在 San Francisco 工作,是一名软件工程师及创业者.当他还在高中的时候就在一家创业公司工作了,他非常喜欢使用 iOS.Android 以及 JavaScri ...

  10. $.ajax 提交数据到后台.

    //AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML -- (Extensible Markup Language 可扩展标记语言 ...