【无标题】

泛型
泛型概述:
NET 自从2.0版本开始就支持泛型。泛型不仅是C#编程语言的一部分,而且与程序集中的IL代码紧密地集成。有了泛型,就可以创建独立于被包含类型的类和方法了。我们不必给不同的类型编写功能相同的许多方法或类,只创建一个方法或类即可。
另一个减少代码的选项是使用Object类,但Object类不是类型安全的。泛型类使用泛型类型,并可以根据需要用特定的类型替换泛型类型。这就保证了类型安全性:如果某个类型不支持泛型类,编译器就会出现错误。
泛型不仅限于类,泛型并不是一个全新的结构,其他语言中有类似的概念。例如,C++模板就与泛型相似。但是,C++模板和NET泛型之间有一个很大的区别。对于CH模板,在用特定的类型实例化模板时,需要模板的源代码。相反,泛型不仅是C#语言的一种结构,而且是CLR定义的。所以,即使泛型类是在C#中定义的,也可以在Visual Basic中用一个特定的类型实例化该泛型。

性能:
泛型的一个主要优点是性能。对值类型使用非泛型集合类,在把值类型转换为引用类型,和把引用类型转换为值类型时,需要进行装箱和拆箱操作。
值类型存储在栈上,引用类型存储在堆上。C#类是引用类型,结构是值类型。.NET 很容易把值类型转换为引用类型,所以可以在需要对象的任意地方使用值类型。例如,int可以赋予一个对象。从值类型转换为引用类型称为装箱。如果方法需要把一个对象作为参数,同时传递一个值类型,装箱操作就会自动进行。另一方面,装箱的值类型可以使用拆箱操作转换为值类型。在拆箱时,需要使用类型强制转换运算符。

代码的扩展:
在用不同的特定类型实例化泛型时,会创建多少代码?因为泛型类的定义会放在程序集中,所以用特定类型实例化泛型类不会在IL代码中复制这些类。但是,在JIT编译器把泛型类编译为本地代码时,会给每个值类型创建一个新类。引用类型共享同一个本地类的所有相同的实现代码。这是因为引用类型在实例化的泛型类中只需要4个字节的内存地址,就可以引用一个引用类型。值类型包含在实例化的泛型类的内存中,同时因为每个值类型对内存的要求都不同,所以要为每个值类型实例化一个新类。

默认值:
现在给DocumentManager类添加一个GetDocumento方法。在这个方法中,应把类型T指定为null。但是,不能把null赋予泛型类型。原因是泛型类型也可以实例化为值类型,而null只能用于引用类型。为了解决这个问题,可以使用default关键字。通过default关键字,将null赋予引用类型,将0赋予值类型。
约束:
如果泛型类需要调用泛型类型中的方法,就必须添加约束。对于DocumentManager,文档的所有标题应在DisplayAliDocuments()方法中显示。Document类实现带有Title和Content属性的IDocument接口

泛型接口:
使用泛型可以定义接口,在接口中定义的方法可以带泛型参数。在链表的示例中,就实现了IEnumerable接口,它定义了 GetEnumerator()方法,以返回IEnumeratorKout。.NET 为不同的情况提供了许多泛型接口,例如IComparable,ICollection和IExtensibleObject,同…个接口常常存在比较老的非泛型版本,例如,.NET 1.0有基于对象的IComparable接口。IComparable基于一个泛型类型:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值