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#)的更多相关文章

  1. Atitit 泛型原理与理解attilax总结

    Atitit 泛型原理与理解attilax总结 1. 泛型历史11.1.1. 由来11.2. 为什么需要泛型,类型安全21.3. 7.泛型的好处22. 泛型的机制编辑22.1.1. 机制32.1.2. ...

  2. C# 泛型的简单理解(安全、集合、方法、约束、继承)

    前言 泛型允许你在编译时实现类型安全.它们允许你创建一个数据结构而不限于一特定的数据类型.然而,当使用该数据结构时,编译器保证它使用的类型与类型安全是相一致的.泛型提供了类型安全,但是没有造成任何性能 ...

  3. C# 泛型的入门理解(来自网络)

    using System.Collections; class Program { //做个比较 static void Main(string[] args) { //new对象 Cls a1 = ...

  4. C#泛型自己的理解和总结

    万事开头难,今天先从随笔开始,记录工作中平时不太注意到的知识点.今天开始说下泛型. 泛型在我们项目中很是常见,使用很广泛,我觉的它有以下几个优点. 1.安全性. 2.性能. 3.二进制代码的重用. 4 ...

  5. 泛型< ? extends > <? super> 理解

    public class Test { public static void main(String [] args){ Plate<? extends Fruit> p = new Pl ...

  6. C# 理解泛型

    出处:http://www.tracefact.net/CSharp-Programming/Generics-In-CSharp.aspx 术语表 generics:泛型type-safe:类型安全 ...

  7. C#泛型理解(转)

    [译]C# 理解泛型  PDF 浏览:http://www.tracefact.net/document/generics-in-csharp.pdf源码下载:http://www.tracefact ...

  8. java泛型的理解

    总体介绍泛型: 1.泛型是计算机程序中一种重要的思维方式,它将数据结构和算法与数据类型相分离,使得同一套数据结构和算法,能够应用于各种数据类型,而且还可以保证类型安全,提高可读性.在Java中,泛型广 ...

  9. 【转载】C# 理解泛型

    术语表 generics:泛型type-safe:类型安全collection: 集合compiler:编译器run time:程序运行时object: 对象.NET library:.Net类库va ...

  10. 如何理解 Java 中的 <T extends Comparable<? super T>>

    Java 中类似 <T extends Comparable<? super T>> 这样的类型参数 (Type Parameter) 在 JDK 中或工具类方法中经常能看到. ...

随机推荐

  1. 前端基础之css介绍

    CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素. 当浏览器读到一个样式表,它就会按照这个样式表来对文档进行格式化(渲染). CSS语法 CSS实例 ...

  2. java bean validation 参数验证

    一.前言 二.几种解决方案 三.使用bean validation 自带的注解验证 四.自定义bean validation 注解验证 一.前言 在后台开发过程中,对参数的校验成为开发环境不可缺少的一 ...

  3. PTA 7-33 地下迷宫探索(深搜输出路径)

    地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰苦卓绝的战争生活的同时,真心钦佩他们的聪明才智. ...

  4. Java03-Java语法基础(二)运算符

    Java语法基础(二)运算符 一.运算符 1.算数运算符:+.-.*./.% 1)双目运算符:二元运算符,参加运算的对象有两个(+.-.*./.%) 2)单目运算符:一元运算符,参加运算的对象只有一个 ...

  5. php使用sftp上传文件

    搞这个SFTP文件传输搞了一整天真是醉了,从sftp安装,到php的ssh2扩展安装,最后到php应用ssh2来上传文件:最后就没有最后了 Failure creating remote file: ...

  6. Jmeter常用脚本开发之FTP请求

    1.没有FTP站点的,可以自己搭建一个FTP站点供测试使用,搭建步骤: l  安装IIS组件,控制面板—>程序和功能—>启用或关闭windows功能,勾选FTP服务器.IIS管理控制台,点 ...

  7. hdu 5418 (Floyd+哈密顿) 飞向世界

    http://acm.hdu.edu.cn/showproblem.php?pid=5418 题目大意是城市的编号是1到n,给出m条路线,表示从a城市飞到b城市飞机要耗多少油,最后问飞机从1出发飞过所 ...

  8. 在nginx中,禁止IP访问.只可以使用域名访问.

    if ($host ~* "\d+\.\d+\.\d+\.\d+"){ ; } 其实说白了, 就是进行host主机头过滤,使用正则来判断下.

  9. python imaplib无痕取信的主要

    typ, data = M.fetch(num, (UID BODY.PEEK[]))  

  10. Codeforces 749D. Leaving Auction set+二分

    D. Leaving Auction time limit per test: 2 seconds memory limit per test:256 megabytes input:standard ...