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.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...
随机推荐
- Vue编写的todolist小例子
Vue编写的todolist小例子 本篇博客主要包含一个内容: 1.第一个内容:使用Vue编写todolist例子,包含的主要知识是v-model,v-for,el表达式,以及Vue中使用method ...
- Linux 基本操作--文件查看 (day3)
一.查看文件-----cat (详情参考:http://blog.sina.com.cn/s/blog_52f6ead0010127xm.html) 语法结构: cat 查看方式 文件 cat -A ...
- 【Teradata SQL】使用SQL将多个逗号分隔改为一个逗号分隔
1.问题说明: //将如下字符串改为一个逗号分隔 张三,李四,王五,,,,,,六,,,,其,,,,,,,,,,,把 ==> 张三,李四,王五,六,其,把 2.解决方法 sel oreplace( ...
- nodejs websocket
<script src="https://cdn.socket.io/socket.io-1.4.5.js"></script> <script ty ...
- 微信小程序多层嵌套循环,二级数组遍历
小程序中的遍历循环类似于angularJS的遍历. 二级数组遍历有一个坑.二级遍历wx:for循环的时候,需要注意.(代码如下) JS代码: data: { groups: [ [ { title: ...
- 贪心——D - Radar Installation
Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. ...
- python之常用模块(续)
time模块 random模块 sys模块 os模块 序列化模块 time模块 有三种方式表示 在Python中,通常有三种方式来表示时间:时间戳.元组(struct_time).格式化的时间字符串 ...
- Linux的目录结构--一切从根开始
Linux目录结构的特点 # 举例-linux下面使用光盘 ###.把光盘放入到光驱中 ###.linux中使用光盘 /dev/cdrom [root@oldboyedu- ~]# ll /dev/c ...
- 当web应用包含了websocket长连接,如何在web应用前加一层nginx转发
1 通过在web应用的前面加一层nginx ,可以实现一台主机部署多个应用,每个应用都可以用不同的域名去访问,并且端口都是80 2 nignx 转发websocket长连接 1 每个web应用,他们运 ...
- Python:Day17 生成器、time和random模块
列表生成式: a = [x*2 for x in range(10)] #这是最简单的列表生成式,range换成其它的序列也OK a = [f(x) for x in range(10)] #将里将前 ...