C# 特性之泛型
2010-09-30 22:35:56 来源:WEB开发网核心提示: 最后类型约束支持继承,但同时你必须在子类定义泛型的时候再重新声明一遍父类的所有约束,C# 特性之泛型(5),设计者的出发点是让程序员能清楚子类中约束从何而来,减少疑惑,并且通过避免装箱和拆箱操作来达到性能提升的目的,因此,但从另外个角度来讲,这样反而会让程序员不得不多添加一些重复的代码
最后类型约束支持继承,但同时你必须在子类定义泛型的时候再重新声明一遍父类的所有约束。设计者的出发点是让程序员能清楚子类中约束从何而来,减少疑惑。但从另外个角度来讲,这样反而会让程序员不得不多添加一些重复的代码,即使你已经知道它的约束条件都有哪些。
泛型内部实现
泛型在.NET中真正做到了平台级别的支持,在C#中,泛型同样是对象。事实上,编译器会在编译的时候将泛型参数转换为特殊的元数据,CLR会根据需要生成其实际的类型。为避免装箱和拆箱,值类型的泛型实现和引用类型的是不一样的。下面我们来具体看看它们有和不同。
1. 值类型的泛型对象实例化
第一次用值类型作为参数来构造泛型类型时,运行库会创建专用泛型类型,将提供的参数代入到 MSIL 中的适合位置。对于每个用作参数的唯一值类型,都会创建一次专用C# 泛型类型。这种特定类型的泛型类其实就相当于包含特定值类型的本地代码,它将对性能提升很有帮助。
2. 引用类型的泛型对象实例化
对于引用类型,泛型的工作方式略有不同。第一次使用任何引用类型构造泛型类型时,运行库会创建专用泛型类型。用对象引用(或者说指针更好)替换MSIL中的参数.然后,每次使用对象的引用作为参数来实例化。构造类型时,无论引用类型的详细类型是什么,运行库都会重用以前创建的泛型类型的专用版本。之所以可以这样, 是因为所有对象引用的大小相同 。
总结
在.NET类库中处处都可以看到泛型的身影,尤其是数组和集合中,泛型的存在也大大提高了程序员的开发效率。更重要的是,C#的泛型比C++的模板使用更加安全,并且通过避免装箱和拆箱操作来达到性能提升的目的。因此,我们很有必要掌握并善用这个强大的语言特性。
- ››特性信息
更多精彩
赞助商链接