C#泛型(C# Generics)
- 概述
- 什么是泛型
- 如何使用泛型
- 泛型约束
C#泛型概述
先看一个通用的数据结构示例:
结构类:
结构类:
public class stack
{
object[] m_Items;
public void Push(object item)
{……}
public object Pop()
{……}
}
基于object解决方案存在的问题
-性能问题:
- 值类型Push时要装箱处理,Pop时要拆箱处理,造成更多的垃圾碎片,增加垃圾收集的负担
- 引用类型也有强制转换的开销
-类型安全问题(更为严重)
- 编译时任何类型都可以转换成object,无法保证运行时的类型安全
解决性能和类型安全的方法:
-编写特定类型的数据结构。
基于编写特定类型的数据结构的问题:
-影响工作效率。
-代码冗余,重用率低。
-一个数据结构变更,要将所有类型的数据结构做相应的修改。
-为了提供不可预知的数据类型的支持,还是要提供object类型接口,类型安全的问题又会出现。
为了解决上面所遇到的问题,现在引入泛型的概念。
什么是泛型?
- 通过泛型可以定义类型安全类,而不损害类型安全、性能或工作效率。
- 可以使用任何类型来声明和实例化。
- 声明和实例化时都必须用一个特定的类型来代替一般类型T
- 通用数据结构采用泛型实现。
编程模型的有点在于,内部算法和数据操作保持不变,而实际数据类型可以在使用时指定。
泛型是如何实现的?
- 在.net 2.0中,泛型在IL(中间语言)和CLR本身中具有本机支持。
- 编译泛型类时,就像编译其他类一样,泛型仅保留一个占位符。
- 而用特定类型实例化泛型代码时,编译时会将泛型替换为实例化的特定类型。
泛型的好处
- 一次性的开发、测试和部署代码,通过任何类型()来重用它
- 编译器支持和类型安全
- 不会强行对值类型进行装箱和拆箱操作,或者对引用类型进行上下强制类型转换,所以性能得到显著提高
-值类型,性能通常会提高200%
-引用类型,在访问类型时,可以预期性能最多提高100%(当然,整个应用程序的性能可能会提高,也 可能不会提高)
应用泛型