泛型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 中或工具类方法中经常能看到. ...
随机推荐
- as3.0复制影片简介(自我复制的三种形式)
//mc是被复制影片简介的实例名,(===在库中找到mc影片简介,右击“属性”,点击“为actionscript导出”,选中确定即可===这个是重点) var newSprite:Sprite=mc; ...
- Mybatis抛出 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@f54509]异常
今天在做Springmvc和spring 时 mybatis 是抛出异常 Closing non transactional SqlSession [org.apache.ibatis.session ...
- 我和struts2 的第一天
文字解析 1.获取正文请求 2.根据请求做出判断 3.执行具体的方法代码 4.跳转页面,展示给用户 Strut 是Apache发行的MVC框架 他只是表现层的框架 Strut1 是2005年流行的框架 ...
- Jenkins安装部署(一)
环境准备 CentOS Linux release 7.4 1.IP:192.168.43.129 2.路径:/mnt 3.jdk版本:jdk1.8.0 4.tomcat版本:tomcat-8.5 5 ...
- c# 文件过大时清空原有内容重新写入
FileStream fs = new FileStream("E:\\Test\\HistoryData.txt", FileMode.Append, FileAccess.Wr ...
- 我的图片爬虫demo
本来是根据scrapy教程写了一个下载图片的简易爬虫,但是搞了一天,死活下载不了图片. 然后换了一个网站,用原生的库写了一个图片爬虫. import urllib.requestimport osde ...
- Codeforces Beta Round #52 (Div. 2)
Codeforces Beta Round #52 (Div. 2) http://codeforces.com/contest/56 A #include<bits/stdc++.h> ...
- Mac快捷键大全
Android Studio command+option+L:格式化代码 Visual Studio Code option+shift+f:格式化代码 先按command+k,再按command+ ...
- JSP中的数据库操作,MySQL基础操作(一)
一.JDBC JDBC(java data base concectivity),是一种用于执行SQL语句的java API,可以为多种关系库提供统一访问. 通常使用JDBC完成以下操作: 1)同数据 ...
- 自己在完第一遍STL和Directx 9.0 游戏开发编程基础书后的体会
如果一本书看一遍就能看懂,说明书对自己相对容易,没有必要在去看第二遍,但是对于大多数书籍,都有自己陌生的知识,看完一遍无法理解的地方,说明就是自己知识点最薄弱的,最需要去理解的地方,一旦自己理解了这些 ...