泛型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 中或工具类方法中经常能看到. ...
随机推荐
- 对话框 AlterDialog
AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("尊敬的用户"); bu ...
- 100-days: Four
Title: Weekend 'catch-up sheep' is a lie catch-up n.补做:赶做 play catch-up 通过追赶,达到同样的水平或程度 catch-up sle ...
- Wannafly挑战赛14 C.可达性(tarjan缩点)
题目描述 给出一个 0 ≤ N ≤ 105 点数.0 ≤ M ≤ 105 边数的有向图, 输出一个尽可能小的点集,使得从这些点出发能够到达任意一点,如果有多个这样的集合,输出这些集合升序排序后字典序最 ...
- 删除sslvpn用户
config user localedit xinghen unset two-factornextend config user groupedit vpngroup unselect member ...
- selenium学习一
chrome版本和chromedriver的对应关系 chromedriver版本 支持的Chrome版本 v2.40 v66-68 v2.39 v66-68 v2.38 v65-67 v2.37 v ...
- wk1&2 字符串
[CQ] 自增怎么样都增了,赋值不一定: int x = 2; int y = 2; int i = ++x; int j = y++; System.out.println(x); System.o ...
- 微信网页JS分享,微信二次分享无缩略图问题
很多时候我们要在微信中分享h5网页,这个时候就得用微信的分享接口来自定义分享的地址.标题.描述.缩略图了. 分享到微信的时候遇到一个问题,就是第一次分享到微信里,是正确的,但是在微信打开分享的链接,再 ...
- vue的通讯与传递props emit (简单的弹框组件)
props父把信息传递给子组件 1父组件 <template> <div class="hello"> <div id="app-3&quo ...
- Linux安装命令出现如下错误:cannot find a valid baseurl for repo :base/7x86_64
今天刚回到家,在我的虚拟机上有安装了一个Linux系统,安装好之后,想要安装如下命令,yum install wget,yum install gcc,yum install vim,发现一个也没有安 ...
- mysql技术内幕之常规使用
mysql中:终止语句方法: 1.在语句结尾处,输入分号(:)表示语句到此结束 2.使用\g(意思是go) \G以垂直的方式显示结果,每行显示一个值 数据库:数据库中包含表,对表中数据执行插入,检索, ...