泛型

性能

泛型的一个重要的优点是性能。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. VB EditGrid的用法

    百度了一下,关于vb 6.0 EditGrid的用法 查不到资料

  2. stormzhang的推荐!

    欢迎转载,但请务必在明确位置注明出处!http://stormzhang.com/android/2014/07/07/learn-android-from-rookie/ QQ交流群:入群理由请正确 ...

  3. Oracle EBS-SQL (SYS-18):检查系统安装的各个表是否打开(PJM%).sql

    select status, trigger_name from all_triggers where trigger_name like 'PJM%'; ALTER TRIGGER PJM_ORG_ ...

  4. Get Intellisense for .axml files in Visual Studio

    原文Get Intellisense for .axml files in Visual Studio So in order to get some intellisense support for ...

  5. centos扩容(pv,vg,lv)

    preFace: (应用场景需求分析)

  6. 修改spinner选中以后显示的字体颜色

    原来spinner选中以后显示的view  还是textview  ,这样就是可以设置它的字体颜色了 sp.setOnItemSelectedListener(new OnItemSelectedLi ...

  7. IHttpModule与IHttpHandler的区别整理

    IHttpModule与IHttpHandler的区别整理1.先后次序.先IHttpModule,后IHttpHandler. 注:Module要看你响应了哪个事件,一些事件是在Handler之前运行 ...

  8. JavaScript之模仿块级作用域

    简介:在JavaScript中没有块级作用域的概念.这意味这在块语句中定义的变量,实际上在包含函数中而非语句中创建的.证明代码如下: function outputNumbers(count){ fo ...

  9. SQL学习之使用视图

    1.简介:视图是虚拟的表.与包含的数据不一样,视图只包含使用时动态检索数据的查询.重点:视图是一个查询,不是一个表!

  10. events模块

    /** * Created by Administrator on 2016/8/3. */ var http = require("http"); //Node 导入文件系统模块 ...