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.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...
随机推荐
- 我的BRF+自学教程(一):公式(formula)
Business Rule Framework Plus(业务规则框架,以下简称BRFplus或BRF+)是一个强大的工具, 它允许用户以直观的方式对规则建模,并在不同的应用程序中重用这些规则.通过它 ...
- 基于python的Selenium使用小结
之前介绍过基于Unittest和TestNG自动化测试框架,然而基于Web端的测试的基础框架是需要Selenium做主要支撑的,这里边给大家介绍下Web测试核心之基于Python的Selenium 一 ...
- sq
CREATE TABLE `message` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `username` varchar(20) DEFAULT NUL ...
- 生成.project、.classpath文件
新导出的项目如果没有.project文件,是不能导入到工具中的,需要执行maven命令生产,在进入工作空间下面,按住shift再点击鼠标右键,点击选择在此处打开命令窗口. 然后输入对应的maven命令 ...
- java和maven环境变量设置,Tomcat部署
Java环境变量设置 Win10我的电脑右击属性,高级系统设置,高级,环境变量设置 新建系统变量JAVA_HOME 和CLASSPATH 变量名:JAVA_HOME 变量值:C:\Program F ...
- 【angularjs】使用angular搭建PC端项目,开关按钮
方法一(使用指令) 1.指令(angular-ui-switch.js) angular.module('uiSwitch', []) app.directive('switch', function ...
- Python脱产8期 Day04 2019/4/16
流程控制 1.宏观一定是自上而下(逻辑上方代码一定比逻辑下方代码先执行):顺序结构2.遇到需要条件判断选择不同执行路线的执行方式:分支结构3.有些事情需要重复不断的去执行(当满足某种条件或不满足某种条 ...
- CF1129E Legendary Tree 构造
传送门 神树可还行 我们令\(1\)为树根,那么如果要询问\(x\)是否在\(y\)子树中,就令\(S = \{1\} , T = \{x\} , u = y\),询问一下就可以知道了. 那么考虑先构 ...
- 记一次Dubbo服务注册异常
公司项目重构,把dubbo版本从2.5.8升级为2.6.2.升级后在本地运行一点问题都没有:可是通过公司自研的发布系统将项目发布到测试环境的linux服务器下面后,出现了dubbo服务 ...
- redis底层设计(四)——功能的实现
redis中我们会经常用到事务.订阅与发布.Lua脚本以及慢查询日志,接下来我们就一一对他们进行探讨学习. 4.1事务 redis通过MULTI.DISCARD.EXEC和WATCH四个命令来实现事务 ...