这一章会描述在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的问题(泛型)的更多相关文章

  1. Java基础复习笔记系列 八 多线程编程

    Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图 ...

  2. Angular复习笔记7-路由(下)

    Angular复习笔记7-路由(下) 这是angular路由的第二篇,也是最后一篇.继续上一章的内容 路由跳转 Web应用中的页面跳转,指的是应用响应某个事件,从一个页面跳转到另一个页面的行为.对于使 ...

  3. Angular复习笔记7-路由(上)

    Angular复习笔记7-路由(上) 关于Angular路由的部分将分为上下两篇来介绍.这是第一篇. 概述 路由所要解决的核心问题是通过建立URL和页面的对应关系,使得不同的页面可以用不同的URL来表 ...

  4. Angular复习笔记6-依赖注入

    Angular复习笔记6-依赖注入 依赖注入(DependencyInjection)是Angular实现重要功能的一种设计模式.一个大型应用的开发通常会涉及很多组件和服务,这些组件和服务之间有着错综 ...

  5. tarjan复习笔记

    tarjan复习笔记 (关于tarjan读法,优雅一点读塔洋,接地气一点读塔尖) 0. 连通分量 有向图: 强连通分量(SCC)是个啥 就是一张图里面两个点能互相达到,那么这两个点在同一个强连通分量里 ...

  6. 树的直径,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 ...

  7. 状压DP复习笔记

    前言 复习笔记第4篇.CSP RP++. 引用部分为总结性内容. 0--P1433 吃奶酪 题目链接 luogu 题意 房间里放着 \(n\) 块奶酪,要把它们都吃掉,问至少要跑多少距离?一开始在 \ ...

  8. 斜率优化DP复习笔记

    前言 复习笔记2nd. Warning:鉴于摆渡车是普及组题目,本文的难度定位在普及+至省选-. 参照洛谷的题目难度评分(不过感觉部分有虚高,提高组建议全部掌握,普及组可以选择性阅读.) 引用部分(如 ...

  9. Java基础复习笔记系列 九 网络编程

    Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...

  10. Java基础复习笔记系列 七 IO操作

    Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...

随机推荐

  1. Angular之模态弹窗ui-bootstrap-modal及轻量级弹窗ngDialog

    ui-bootstrap 中模态 官网 angular-ui-bootstrap   对于ui-bootstrap集成大量指令如折叠ui.bootstrap.accordion.时间插件ui.boot ...

  2. U盘插入电脑3.0的口没有反应了,2.0的口就可以

    如果驱动没有问题的话,很有可能是优盘硬件故障. 尝试解决办法: 1.使劲插(就是用力一插到底).... 2.插入三分之一,不过速度只能达到2.0的速度.

  3. 11.scrapy框架持久化存储

    今日概要 基于终端指令的持久化存储 基于管道的持久化存储 今日详情 1.基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的 ...

  4. 【DB2基础】DB2编目和数据库连接

    1.编目节点和编目数据库 编目(Catalog),是在本地或远程建立客户端到服务器的数据库连接的过程.其目的在于获取编目信息,即生成用来访问数据库的目录. 系统数据库目录包含一个列表和指针,通过目录可 ...

  5. wrk 压力测试 http benchmark POST接口

    简单的 http 性能测试工具 wrk.git 一个简单的 http benchmark 工具, 能做很多基本的 http 性能测试. wrk 的一个很好的特性就是能用很少的线程压出很大的并发量. 原 ...

  6. 更改django的时区

    TIME_ZONE='Asia/Shanghai' datetime_obj.replace(tzinfo=(pytz.timezone("Asia/Shanghai"))).st ...

  7. JAVA序列化和反序列化XML

    package com.lss.utils; import java.beans.XMLDecoder; import java.beans.XMLEncoder; import java.io.Bu ...

  8. java发送163邮件

    在服务挂掉后,可以采用发送邮件的方式来通知开发人员进行异常处理 import java.io.IOException; import java.util.Properties; import java ...

  9. UVA120-Stacks of Flapjacks(思维)

    Problem UVA120-Stacks of Flapjacks Accept: 9232  Submit: 38455Time Limit: 10000 mSec Problem Descrip ...

  10. iptables 从一台机到另一台机端口转发

    启用网卡转发功能#echo 1 > /proc/sys/net/ipv4/ip_forward 举例:从192.168.0.132:21521(新端口)访问192.168.0.211:1521端 ...