泛型

性能

泛型的一个重要的优点是性能。system.collections和system.collections.generic名称空间的泛型和非泛型集和类。对值类型使用非泛型集合类,在把值类型转换为引用类型,和把引用类型转换为值类型时,需要进行装箱和拆箱。

值类型储存在在栈上,引用类型储存在在堆上。c#类是引用类型,结构是值类型。

例子显示了system。collections名称空间中的arraylist类。

装箱和拆箱会降低性能,便利许多项目时尤其如此。

system.collections.generic名称空间的list<T>类不使用对象,而是在使用时定义类型。

上例中List<T>类的泛型类型定义为int所以int类型在JIT编辑器动态生成的类中使用。

类型安全

泛型的另一个特性是类型安全。

这个例子在ArrayList类型的集合中添加一个整数,一个字符串和一个Myclass类型的对象。

二进制代码的重用

泛型允许更好的重用二进制代码。泛型类可以定义一次,并且可以用许多不同的类型实例化。

system.collections.generic名称空间中的list<t>类中的一个int,一个字符串和一个myclass类型实例化。

命名约定

泛型类型的命名规则:

泛型类型的名称用字母T作为前缀。假如没有特殊的要求,泛型类型允许用任意类类替代,且只用一个泛型类型,就可以用字符T作为泛型类型的名称。

创建泛型类

在链表中,一个元素引用下一个元素。所以必须创建一个类,它将对象封装在链表中,并引用下一个对象。

假如链表为空,first和last属性就设置为该新元素,否则,就把新元素添加为链表中的最后一个元素。

上面通过实现getenumertor()方法时,可以用foreach语句遍历链表。getenumertor()方法使用yield语句创建一个枚举器类型。

上表是创建链表的泛型版本。LinkedListNode类用一个泛型类型T声明,属性Value的类型时T而不是object。

下面的代码把LinkedList类也改为泛型类。

LinkedList<T>包含linkedlistnode<T>元素。linkedlist中的类型T定义了类型T的属性first和last。

使用泛型类linkedlist<t>,可以用int类型实例化它,假如不用addLast()方法传递int,就会出现一个编译错误。用ienumerable<t>,foreach语句也是类型安全的,假如foreach语句变量不用int,就会出现错误:

泛型类的功能

介绍使用泛型文档管理器的实例。

约束

假如泛型类需要调用泛型类中的方法,就必须添加约束。

Document类实现带有Title和Content属性的IDocument接口:

给DocumentManger<TDocument>类定义一个约束:TDocument类型必须实现IDocument接口。

就可以编写foreach语句:

继承

泛型类型可以实现泛型接口,也可以派生自一个类。泛型类可以派生自泛型基类:

于是,派生类可以是泛型类或非泛型类。特定类型执行特殊操作,定义抽象的泛型基类。

两组静态字段:

协变和抗变

.NET中,参数类型时协变得。声明Display()方法是为了接受Shape类型的对象作为其参数:

public void Display(shape 0){}

编译器接受这个调用方法:

方法的返回类型是抗变的。

开始定义shape基类和rectangle类:

泛型接口的协变

如果泛型类型用out关键字标注,泛型接口就是协变得。返回类型只能是T.

IIndex<T>接口用rectanglecollection类来实现,rectanglecollection类为泛型类型T定义了rectangle:

泛型接口的抗变

如果泛型类型用in关键字标注,泛型接口就是抗变得。泛型T的输入:

泛型结构

.NET Framework中的泛型结构是Nullabe<T>.

下面的代码段说明了如何定义Nullabe<T>的一个简化版本。

在这个例子中,Nullabe<T>用Nullabe<int>实例化,变量现在可以用作一个int,进行赋值或是运算符执行一些计算。x可以为空。

泛型方法

在泛型方法中,泛型类型用方法声明来定义。泛型方法可以在非泛型中定义。

下例使用泛型方法累加集合中的所有元素

其中应累加余额的所有账户操作都添加到List<Account>类型的账户列表中:

在这个方法的实现代码中,直接访问Account对象的Balance属性:

泛型方法规范

如果传递一个int,就选择带int参数的方法,对于任何其他参数类型,编译器会选择方法的泛型版本:

下面实例代码给该方法传递了一个int和一个string:

注意,所调用的方法是在编译期间定义的,而不是运行期间。

一步一步学c#(五):泛型的更多相关文章

  1. 一步一步学android控件(之十五) —— DegitalClock & AnalogClock

    原本计划DigitalClock和AnalogClock单独各一篇来写,但是想想,两个控件的作用都一样,就和在一起写一篇了. DegitalClock和AnalogClock控件主要用于显示当前时间信 ...

  2. 一步一步学Linq to sql(五):存储过程

    普通存储过程 首先在查询分析器运行下面的代码来创建一个存储过程: create proc sp_singleresultset as set nocount on select * from cust ...

  3. 一步一步学ROP之linux_x64篇

    一步一步学ROP之linux_x64篇 一.序 **ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防 ...

  4. 一步一步学ROP之linux_x86篇

    一步一步学ROP之linux_x86篇 作者:蒸米@阿里聚安全 ​ 一.序 ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过 ...

  5. (转载)一步一步学Linq to sql系列文章

    现在Linq to sql的资料还不是很多,本人水平有限,如果有错或者误导请指出,谢谢. 一步一步学Linq to sql(一):预备知识 一步一步学Linq to sql(二):DataContex ...

  6. 【DG】[三思笔记]一步一步学DataGuard

    [DG][三思笔记]一步一步学DataGuard 它有无数个名字,有人叫它dg,有人叫它数据卫士,有人叫它data guard,在oracle的各项特性中它有着举足轻理的地位,它就是(掌声)..... ...

  7. 一步一步学Silverlight 2系列(27):使用Brush进行填充

    概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  8. 一步一步学Silverlight 2系列(20):如何在Silverlight中与HTML DOM交互(下)

    述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  9. 一步一步学Silverlight 2系列(17):数据与通信之ADO.NET Data Services

    概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  10. 一步一步学Silverlight 2系列(5):实现简单的拖放功能

    述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

随机推荐

  1. 理解TCP为什么需要进行三次握手

        在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认: ...

  2. poj1580---欧几里得算法(辗转相除法)

    #include<stdio.h> #include<string.h> #include<string.h> ],str2[]; int len; int cal ...

  3. OpenNebula openldap集成

    Preface: 当前写这篇post的心情可谓是即激动,又操蛋!............................ ruiy还是言归正传,人老了,赖的扯淡了,哥当前一心看向Tech(s),做个顾 ...

  4. 用sqlserver处理excel表格

    本来最近在研究微信公众平台的,老大临时交我个任务,把excel表格里的数据导入sql数据库,我想这so easy嘛. 没想都在上面消磨了两天... 把情况介绍下:在数据库中有如下这样结构的表(A表) ...

  5. saiku导出excel单元格格式与中文列宽自动适应

    在saiku导出excel后打开发现单元格的整数也显示为小数,并且含有中文的列宽没有自动适应,解决办法如下: 打开ExcelWorksheetBuilder.java文件,找到applyCellFor ...

  6. Largest Rectangle in a Histogram(最大矩形面积,动态规划思想)

    Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  7. 红豆带你从零学C#系列之:初识继承与多态

    继承 现实生活当中,人类又可以根据职业分为:教师,学生,理发师,售货员 又比如飞机又有种类之分:直升飞机.客机.货机.战斗机等 在程序里面我们可能会通过创建类来描述这样的事物,比如学生类.教师类.理发 ...

  8. C# 微信公众平台开发(1)-- 服务器配置

    题记:最近公司需要开发微信服务号,由本人负责,以前虽然听过微信开发,但并没有认真的去了解,项目开发中,也边看文档边开发,记录自己的项目开发经验: 1.注册帐号--填写服务器配置 在https://mp ...

  9. 升级python的sqlite库版本

    今天了解了一下用python获取chrome cookie信息,在研究的过程中,发现打开数据库失败,后来调查了一下发现是由于sqlite3库太老的缘故,起码需要3.8以上,然后看了一下python 2 ...

  10. (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)

    We have already seen how to make jQuery react to the loading of a web page. The $(document).ready()e ...