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. leetcode 字符串类型题

    1,Vaild Palindrome bool isPalindrome(string& s) { transform(s.begin(), s.end(), s.begin(), tolow ...

  2. poj3104(二分)

    题目链接:http://poj.org/problem?id=3104 题意:有n件衣服,每一件含有a[i]单位的水,每分钟衣服可以自然蒸发1单位的水,也可以在烘干器上每分钟烘干k单位的水,问将所有衣 ...

  3. Android 性能测试之CPU

    接上一篇 CPU跟内存一样,存在一些测试子项,如下清单所示 1.空闲状态下的应用CPU消耗情况 2.中等规格状态下的应用CPU消耗情况 3.满规格状态下的应用CPU消耗情况 4.应用CPU峰值情况 C ...

  4. Angular之模版引用变量

    A template reference variable is often a reference to a DOM element within a template. It can also b ...

  5. vue 实现多选

    v-model <template> <!--用户页面-选择关注--> <div class="follow"> <h4>选择关注& ...

  6. PTA 7-2 符号配对(栈模拟)

    请编写程序检查C语言源程序中下列符号是否配对:/*与*/.(与).[与].{与}. 输入格式: 输入为一个C语言源程序.当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束.程序中需要检查配对 ...

  7. Unicode编码字符范围和具体文字

    1)标准CJK文字 http://www.unicode.org/Public/UNIDATA/Unihan.html 2)全角ASCII.全角中英文标点.半宽片假名.半宽平假名.半宽韩文字母:FF0 ...

  8. 论equals与==不同的重要性

    首先借鉴一下CSDN前辈的总结: 在编程中,通常比较两个字符串是否相同的表达式是“==” ,但在 Java 中不能这么写.在 Java 中,如果要比较 a 字符串是否等于 b 字符串,需要这么写: i ...

  9. ubuntu下sudo apt-get update Sources 404 Not Found 解决方法

    刚安装了ubuntu之后的主要安装命令无非就是apt-get install了,然而很多都在这里就夭折了. 使用apt-get install ***需要先执行apt-get update 加载文件包 ...

  10. YII2中查询生成器Query()的使用

    YII2中的yii\db\Query给我们提供了非常丰富的方法,方便我们构建复杂的SQL语句. Query()与createCommand最大区别在于,后者直接使用我们写好的SQL语句,前者通过参数和 ...