C#复习笔记(3)--C#2:解决C#1的问题(泛型)
这一章会描述在C#2中所做的主要的变化
泛型
泛型的概念中包含类型参数和类型实参,类型参数相当于类型实参的蓝图。
泛型类型分为未绑定泛型类型和已构造泛型类型。已构造泛型类型又分为开放的泛型类型和封闭的泛型类型。只要不是封闭的泛型类型,都是开放的泛型类型。
泛型约束
① :class 表示类型参数必须是一个引用类型。使用:class来约束时,就可以用==和!==来比较引用。
②:struct表示类型参数必须是一个值类型,用:struct来约束的话就不能用==和!==来比较。
③:new表示类型实参必须有一个无参的构造函数。这个适用于所有的值类型。和显示的声明了无参构造函数的引用类型。以及没有显示声明构造函数的引用类型(非抽象类)。
④还有一种是类型转换约束,可以用类型转换约束来实现更加强大的功能。这种约束允许你指定另外一个类型,类型实参必须通过一致性、引用或装箱转换隐式地转换为该类型。类型转换约束可以指定多个接口,但只能指定一个类,因为C#是单继承的语言
转换类型约束也许是最有用的一种约束,因为它可以在类型实参的实力上使用指定类型的成员。
⑤最后一种是组合约束。
泛型的类型推断只适用于泛型的方法,不适用于泛型类型。
每一个封闭类型都有自己的静态字段集JIT为每个以值类型作为类型实参的封闭类型都创建不同的代码,但是,CLR采用的是懒原则,除非需要,否则不会再为相同封闭类型的泛型类型生成代码。一旦生成了代码,就会缓存起来,以便后面再用。
然而,所有使用引用类型( string、 Stream、 StringBuilder 等)作为类型实参的封闭类型都共享相同的本机代码。之所以能这样做,是由于所有引用都具有相同的大小(32位CLR上是4字节, 64位CLR上是8字节。 但是,在任何一个特定的CLR中,所有引用都具有相同的大小)。
一个基本原则是,如果没有问题,泛型接口都应该集成对应的非泛型接口,这样可以实现协变性。例如,加入以前为.net 1.1写的一个函数要获取IEnumerable类型的参数,而现在有了IEnumerable<T>。假如没有继承,就不能传入IEnumerable<T>。
typeof(或者Type.GetType())可通过两种方式作用于泛型类型—— 一种方式是获取泛型类型定义( 即“ 未绑定泛型类型”),另一种方式是获取特定的已构造类型(实际上只能访问已构造中的封闭类型)。Type.GetType()也可以通过字符串的形式获取一个泛型类型定义。
和普通类型一样,每个特定的类型只有一个type对象。所以,调用两次MakeGenericType,每次都传递相同的类型实参,则会返回同一个引用。GetGenericTypeDefinition也一样的道理。解释一下这俩个方法:前者是作用于已构造的类型,获取它的泛型类型定义,后者是作用于泛型类型定义,返回一个已构造类型。所以,MakeGenericTpye的真实含义是创建一个已构造的泛型类型。
Type.GetType()与typeof操作符相比拥有更多的API,比如可以给Type.GetType()传入一个字符串可以获取到已构造的泛型类型或者未绑定的泛型类型。后者可以通过MakeGenericType设置类型实参从而变成已构造的封闭的泛型类型。
注意:从泛型类型定义获取的方法不能直接调用,相反,必须从一个已构造的类型获取方法。无论是泛型方法还是非泛型方法,这一点都适用。
C#复习笔记(3)--C#2:解决C#1的问题(泛型)的更多相关文章
- Java基础复习笔记系列 八 多线程编程
Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图 ...
- Angular复习笔记7-路由(下)
Angular复习笔记7-路由(下) 这是angular路由的第二篇,也是最后一篇.继续上一章的内容 路由跳转 Web应用中的页面跳转,指的是应用响应某个事件,从一个页面跳转到另一个页面的行为.对于使 ...
- Angular复习笔记7-路由(上)
Angular复习笔记7-路由(上) 关于Angular路由的部分将分为上下两篇来介绍.这是第一篇. 概述 路由所要解决的核心问题是通过建立URL和页面的对应关系,使得不同的页面可以用不同的URL来表 ...
- Angular复习笔记6-依赖注入
Angular复习笔记6-依赖注入 依赖注入(DependencyInjection)是Angular实现重要功能的一种设计模式.一个大型应用的开发通常会涉及很多组件和服务,这些组件和服务之间有着错综 ...
- tarjan复习笔记
tarjan复习笔记 (关于tarjan读法,优雅一点读塔洋,接地气一点读塔尖) 0. 连通分量 有向图: 强连通分量(SCC)是个啥 就是一张图里面两个点能互相达到,那么这两个点在同一个强连通分量里 ...
- 树的直径,LCA复习笔记
前言 复习笔记第6篇. 求直径的两种方法 树形DP: dfs(y); ans=max( ans,d[x]+d[y]+w[i] ); d[x]=max( d[x],d[y]+w[i] ); int di ...
- 状压DP复习笔记
前言 复习笔记第4篇.CSP RP++. 引用部分为总结性内容. 0--P1433 吃奶酪 题目链接 luogu 题意 房间里放着 \(n\) 块奶酪,要把它们都吃掉,问至少要跑多少距离?一开始在 \ ...
- 斜率优化DP复习笔记
前言 复习笔记2nd. Warning:鉴于摆渡车是普及组题目,本文的难度定位在普及+至省选-. 参照洛谷的题目难度评分(不过感觉部分有虚高,提高组建议全部掌握,普及组可以选择性阅读.) 引用部分(如 ...
- Java基础复习笔记系列 九 网络编程
Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...
- Java基础复习笔记系列 七 IO操作
Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...
随机推荐
- Markdown编辑器开发记录(二):Markdown编辑器的使用与开发入门
Markdown编辑器的使用与开发入门 在部门做技术分享的时候简单整理了一下手里的资料 1 是什么 1.1 Markdown是一种轻量级标记语言 Markdown是一种轻量级标记语言,创始人为约翰·格 ...
- 《Java大学教程》—第13章 程序包
接下来,是第二学期的内容,也是相对深入的Java学习. 自测题:1. 在类的开发过程中,程序包的作用是什么?P321程序包是为了方便定位和部署类,还可以避免将来类之间出现名称冲突. 2. ...
- js格式化输入框内金额、银行卡号[转]
这篇文章主要介绍了js格式化输入框内金额.银行卡号,采用“keyup”事件处理格式化,每4位数一组中间空格隔开,如何格式化输入框内金额.银行卡号,需要了解的朋友可以参考一下 我们在项目中经常遇到需要格 ...
- linux学习笔记整理(四)
第五章 Vim编辑器和恢复ext4下误删除的文件-Xmanager工具本节所讲内容:5.1 vim的使用5.2 实战:恢复ext4文件系统下误删除的文件5.3 实战:使用xmanager等远程连接工具 ...
- Python 属性与方法 概念理解
属性与方法 attribute(属性)是class(类)中的成员变量,而method(方法)则是class(类)中的function(函数). 也可以理解,属性就类变量,方法就是类函数. 类中的变量就 ...
- Python:Day16 闭包、装饰器
def outer(): x = 10 def inner(): #条件一.inner就是一个内部函数 print(x) #条件二.引用外部作用域的一个变量,因为x在函数外部的,所以是外部作用域的变量 ...
- VS2015中配置Eigen
Eigen非常方便矩阵操作,当然它的功能不止如此.矩阵操作在算法研究过程中,非常重要,例如在图像处理中二维高斯拟合求取光斑中心时使用Eigen提供的矩阵算法,差不多十来行代码即可实现. 1)下载Eig ...
- (4)HomeAssistant 自动化
https://www.home-assistant.io/docs/automation/ 触发器,条件和动作. (trigger) When Paulus arrives home (condit ...
- ActiveMQ安装配置及使用 转发 https://www.cnblogs.com/hushaojun/p/6016709.html
ActiveMQ安装配置及使用 ActiveMQ介绍 ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JM ...
- pytorch .detach() .detach_() 和 .data用于切断反向传播
参考:https://pytorch-cn.readthedocs.io/zh/latest/package_references/torch-autograd/#detachsource 当我们再训 ...