一步一步学c#(五):泛型
泛型
性能
泛型的一个重要的优点是性能。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#(五):泛型的更多相关文章
- 一步一步学android控件(之十五) —— DegitalClock & AnalogClock
原本计划DigitalClock和AnalogClock单独各一篇来写,但是想想,两个控件的作用都一样,就和在一起写一篇了. DegitalClock和AnalogClock控件主要用于显示当前时间信 ...
- 一步一步学Linq to sql(五):存储过程
普通存储过程 首先在查询分析器运行下面的代码来创建一个存储过程: create proc sp_singleresultset as set nocount on select * from cust ...
- 一步一步学ROP之linux_x64篇
一步一步学ROP之linux_x64篇 一.序 **ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防 ...
- 一步一步学ROP之linux_x86篇
一步一步学ROP之linux_x86篇 作者:蒸米@阿里聚安全 一.序 ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过 ...
- (转载)一步一步学Linq to sql系列文章
现在Linq to sql的资料还不是很多,本人水平有限,如果有错或者误导请指出,谢谢. 一步一步学Linq to sql(一):预备知识 一步一步学Linq to sql(二):DataContex ...
- 【DG】[三思笔记]一步一步学DataGuard
[DG][三思笔记]一步一步学DataGuard 它有无数个名字,有人叫它dg,有人叫它数据卫士,有人叫它data guard,在oracle的各项特性中它有着举足轻理的地位,它就是(掌声)..... ...
- 一步一步学Silverlight 2系列(27):使用Brush进行填充
概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
- 一步一步学Silverlight 2系列(20):如何在Silverlight中与HTML DOM交互(下)
述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
- 一步一步学Silverlight 2系列(17):数据与通信之ADO.NET Data Services
概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
- 一步一步学Silverlight 2系列(5):实现简单的拖放功能
述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
随机推荐
- C++设计模式之装饰者模式
#include "HandCake.h" //手抓饼 HandCake::HandCake() { ; this->name="手抓饼"; } Hand ...
- canvas1
canvas学习(一) Canvas 学习之路 (一) canvas 是H5 里面神一样的东西,使得只是通过html和js就能做出非常棒的游戏和画面. 因为对前端无限的爱好,更加对canvas充满好奇 ...
- MySQL read_only选项的作用
1作用: 从字面意思上看就可以知道这个是把mysql设置为只读,但是这个只读只是针对一般用户而言的,对于root这种用super权限的用户read_only是没有用的. 2设置方式: set glob ...
- Top free and open source log management software
As mentioned in the previous post, in my quest to find an alternative to Kiwi Syslog, I looked at a ...
- IP地址获取到为0:0:0:0:0:0:0:1
引用 13 楼 oXiaoShe 的回复: Quote: 引用 11 楼 ahjsdzm 的回复: [Quote=引用 9 楼 huazaiyou 的回复:]最近在进行web开发时,遇到了reques ...
- 单机Oracle+asm(11.2.0.3.0) Patch Set Update(11.2.0.3.7 )
之前写过一篇关于PSU升级的案例,参考如下: http://blog.csdn.net/jyjxs/article/details/8983880 但是,感觉有些地方理解的不是很透彻明白,照猫画虎的比 ...
- HTML加载顺序总结测试
首先,页面加载顺序:解析HTML结构.加载外部脚本和样式表文件.解析并执行脚本代码.构造HTML DOM模型.加载图片等外部文件.页面加载完毕. 也就是:html → head → title → # ...
- Pig Latin儿童黑话(java)
●假设单词以辅音字母開始,将词首的辅音字母字符串(第一个元音字母前的全部字母)从单词的开头移动到末尾,然后加上后缀ay,这样就形成了它的pig latin. ●假设单词以元音字母開始,仅仅须要 ...
- Android @+id与@id的区别
Android中的组件需要用一个int类型的值来表示,这个值也就是组件标签中的id属性值.id属性只能接受资源类型的值,也就是必须以@开头的值,例如,@id/abc.@+id/xyz等. 如果在@ ...
- (转)探讨:ASP.NET技术的学习顺序问题
探讨:ASP.NET技术的学习顺序问题 摘要:很多人对于ASP.NET的入门和学习顺序比较迷茫,今天让我们一起来跟随作者的思路学习探讨ASP.NET的学习顺序问题,希望有所帮助. 如果你已经有较多的面 ...