泛型c#(深入理解c#)
1.泛型带来的好处非常像静态语言较之动态语言的优点:更好的编译时检查,更多在代码中能直接表现的信息,更多的IDE支持,更好的性能。泛型的好处之一就是在编译时执行更多的检查,所以等到编译不在报错时,就极有可能已经得到了能正常工作的代码。
2.泛型有两种形式:泛型类型(包括类,接口,委托和结构---没有泛型枚举)和泛型方法
3.类型约束
(1) 引用类型约束:用于确保使用的类型实参是引用类型(它表示成T:class,且必须是为类型参数指定的第一个约束)。类型实参任何类,接口,数组,委托,或者已知是引用类型的另一个类型参数,struct RefSample<T> where T :class
(2) 值类型约束:这种约束表示成T:struct,可以确保使用的类型实参是值类型,包括枚举,但是,它将可空类型排除在外,class ValSample<T> where T :struct,类型参数被约束为值类型后,就不允许使用 == 和!=进行比较。
(3) 构造函数类型约束:构造函数类型约束表示成T:new(),必须是所有类型参数的最后一个约束,它检查类型实参是否有一个用于创建类型实例的无參构造函数。这适用于所有值类型;所以没有显式声明构造函数的非静态,非抽象类;所有显式声明了一个公共无參构造函数的非抽象类
pulic T CreateInstance<T> where T : new()
{
return new T();
}
说明:涉及值类型和构造函数时,c#和CLI标准有一个不一致的地方。c#规范则规定,所有值类型都有一个默认的无參构造函数,而且显式声明的构造函数和无參构造函数是用相同的语法来调用的,至于调用哪一个,要依赖于编译器正在底层进行的工作。CLI规范则没有这些要求,不过它提供了一个特殊的指令,可以在不指定任何参数的情况下创建默认值。
(4) 转换类型参数约束:最后一种约束允许你指定另一个类型,类型实参必须可以通过一致性,引用或装箱转换为该类型。你还可以规定一个类型实参必须可以转换为另一个可以转换为另一个类型实参----这称为类型参数约束。写法 ::+ 类型。
(5) 组合约束:如果存在多个转换类型约束,并且其中一个为类,那么它应该出现在接口的前面,而且我们不能多次指定同一个接口。不同的类型参数可以有不同的约束,他们分别由一个单独的where引入。
规范中的术语:规范中对约束的分类略有不同,他将其划分为主要约束,次要约束和构造函数约束。主要约束可以引用类型约束,值类型约束或使用类的转换类型约束。次要约束为使用接口或其他类型参数的转换类型约束,主要约束是可选的,但只能有一个;次要约束则可以有多个;构造函数约束也是可选的(如果拥有了值类型约束,就不能再使用构造函数约束)。
4. 高级泛型
(1). 静态字段和静态构造函数
每个封闭类型都有它自己的静态字段集 ,每个实例化出的类有一个静态字段。
和非泛型类型一样,任何封闭类型的静态构造函数只执行一次。
(2).泛型迭代
System.Collections.IEnumerable<T>和System.Collections.Generic.IEnumerable<T>
前面的是旧的方法(非泛型),后面的是新的(泛型方法),好处是在遍历时由值类型的元素构成的泛型集合(比如List<int>)时,根本不会发生装箱。如果换用旧接口,虽然在存储了列表元素时不会发生装箱开箱,但在用foreach取值时,还是要对他们进行装箱。
5. 反射和泛型
(1). typeof可通过两种方式作用于泛型类型——一种是获取泛型定义(即未绑定泛型类型),另一种方式是获取特定已构造的类型,为了获取泛型类型定义(即没有指定任何实参的类型),需要提供声明的类型名称,删除所有类型参数名称,但保留逗号。为了获取已构造类型,需要采取与声明泛型类型变量时相同的方式指定类型实参就行。
6.泛型在c#和其他语言中的限制
(1) 泛型不支持可变性——他们是不变体。这是为类型安全性着想,但他有时也会带来不变。
泛型c#(深入理解c#)的更多相关文章
- Atitit 泛型原理与理解attilax总结
Atitit 泛型原理与理解attilax总结 1. 泛型历史11.1.1. 由来11.2. 为什么需要泛型,类型安全21.3. 7.泛型的好处22. 泛型的机制编辑22.1.1. 机制32.1.2. ...
- C# 泛型的简单理解(安全、集合、方法、约束、继承)
前言 泛型允许你在编译时实现类型安全.它们允许你创建一个数据结构而不限于一特定的数据类型.然而,当使用该数据结构时,编译器保证它使用的类型与类型安全是相一致的.泛型提供了类型安全,但是没有造成任何性能 ...
- C# 泛型的入门理解(来自网络)
using System.Collections; class Program { //做个比较 static void Main(string[] args) { //new对象 Cls a1 = ...
- C#泛型自己的理解和总结
万事开头难,今天先从随笔开始,记录工作中平时不太注意到的知识点.今天开始说下泛型. 泛型在我们项目中很是常见,使用很广泛,我觉的它有以下几个优点. 1.安全性. 2.性能. 3.二进制代码的重用. 4 ...
- 泛型< ? extends > <? super> 理解
public class Test { public static void main(String [] args){ Plate<? extends Fruit> p = new Pl ...
- C# 理解泛型
出处:http://www.tracefact.net/CSharp-Programming/Generics-In-CSharp.aspx 术语表 generics:泛型type-safe:类型安全 ...
- C#泛型理解(转)
[译]C# 理解泛型 PDF 浏览:http://www.tracefact.net/document/generics-in-csharp.pdf源码下载:http://www.tracefact ...
- java泛型的理解
总体介绍泛型: 1.泛型是计算机程序中一种重要的思维方式,它将数据结构和算法与数据类型相分离,使得同一套数据结构和算法,能够应用于各种数据类型,而且还可以保证类型安全,提高可读性.在Java中,泛型广 ...
- 【转载】C# 理解泛型
术语表 generics:泛型type-safe:类型安全collection: 集合compiler:编译器run time:程序运行时object: 对象.NET library:.Net类库va ...
- 如何理解 Java 中的 <T extends Comparable<? super T>>
Java 中类似 <T extends Comparable<? super T>> 这样的类型参数 (Type Parameter) 在 JDK 中或工具类方法中经常能看到. ...
随机推荐
- with as 如何工作
with as 如何工作 with如何工作? Python对with的处理还是很机智滴.基本思想就是with所求值的对象必须有一个__enter__()方法,一个__exit__()方法 紧跟wi ...
- NumPy 数学函数
NumPy 数学函数 NumPy 包含大量的各种数学运算的函数,包括三角函数,算术运算的函数,复数处理函数等. 三角函数 NumPy 提供了标准的三角函数:sin().cos().tan(). 实例 ...
- stm32GPIO的8种工作模式
推挽输出:可以输出高.低电平,连接数字器件:推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止.高低电平由IC的电源决定. 推挽电路是两个参数相同的三极管或MOS ...
- Server2003+IIS6+TP-Link+花生壳配置
Server2003+IIS6+TP-Link+花生壳配置外网一共分四步: 固定Server2003电脑的局域网IP地址. 设置IIS网站中的TCP端口. 在TP-Link中设置转发规则. 申请花生壳 ...
- tomcat-maven-plugin的使用
maven有一个把web应用部署到tomcat下的插件 tomcat-maven-plugin , 我们可以使用这个插件把web应用一键式的部署到一个远程的tomcat中. 插件的url: http: ...
- 4-java 格式化输出
java保留两位小数4种方法 import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberF ...
- 用js写已知abc+cba = 1333,其中a、b、c均为一位数,编程求出满足条件的a、b、c所有组合。
<!--<script type="text/javascript"> //已知abc+cba = 1333,其中a.b.c均为一位数,编程求出满足条件的a.b. ...
- js sort
排序算法 比较的过程必须通过函数抽象出来.通常规定,对于两个元素x和y,如果认为x < y,则返回-1,如果认为x == y,则返回0,如果认为x > y,则返回1,这样,排序算法就不用关 ...
- springboot中controller的使用
一.知识点 1 @Controller 处理http请求(不推荐使用) 2 @RestController spring4之后新加的注解,原来返回json需要@ResponseBody配合@Contr ...
- PAT 1032 挖掘机技术哪家强(20)(有测试样例)
1032 挖掘机技术哪家强(20)(20 分) 为了用事实说明挖掘机技术到底哪家强,PAT组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第1行给出不超过10 ...