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.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...
随机推荐
- Java 7 for Absolute Beginners/Java 7基础教程--代码纠错
中文版书中的问题代码记录: 只记录了P213后面的错误代码,如果后面发现P213页前面的错误代码,会继续补齐.但我提供的代码都是可以正常运行的,如果有使用者发现中文版书中其他的错误代码请告诉我,方便我 ...
- Linux配置本地yum源
最近在配置zabbix时,遇到CentOS 无法连接网络问题,搜索到一种配置本地yum源的方法,特此记录 一.联网安装预处理 配置缓存,修改/etc/yum.conf [main] cachedir= ...
- php 10进制转62进制,可用于短网址生成
<?php /** * 十进制数转换成62进制 * * @param integer $num * @return string */ function from10_to62($num) { ...
- unique
作用: 元素去重,即“删除”序列中所有相邻的重复元素(只保留一个) (此处的删除,并不是真的删除,而是指重复元素的位置被不重复的元素占领了) (其实就是把多余的元素放到了最后面) 由于它“删除”的是相 ...
- netty简单样例
package com.example.demohystrix.process; import io.netty.bootstrap.ServerBootstrap; import io.netty. ...
- ODOO(ERP源码安装)
cat /etc/centos-release CentOS Linux release 7.4.1708 (Core) uname -r 3.10.0-693.el7.x86_64 IP:192.1 ...
- VMware中安装Centos 7
1.点击“文件-新建”,如下图 2.选择"典型".下一步 3.选择”稍后安装操作系统”,下一步. 4.选择要安装的操作系统类型,下一步 5.填写虚拟机名称,设置虚拟机的存放位置,下 ...
- 修改spring源码重写classloader实现项目加密
(一)操作方法和spring源码添加修改部分 事先说明:spring源码要下载好,会有修改spring的源码操作,本文和本作者所依赖的spring项目的版本是3.1.1,spring4及以上源码对 ...
- 【转】MySQL中的共享锁与排他锁
在MySQL中的行级锁,表级锁,页级锁中介绍过,行级锁是Mysql中锁定粒度最细的一种锁,行级锁能大大减少数据库操作的冲突.行级锁分为共享锁和排他锁两种,本文将详细介绍共享锁及排他锁的概念.使用方式及 ...
- 广师大python学习笔记求派的值
用python语言算π值并且带有进度条 用python算圆周率π 1.准备第三方库pip 2.利用马青公式求π 3.用python语言编写出求圆周率到任意位的程序如下: from math impor ...