CLR Generic
最近在读CLR VIA C#这本著作。看了三分之一,已经有很多感慨了,在此记录一二。
CLR自2.0开始支持泛型(Generic),不仅提供了编译时类型安全的保证,更在很大程度上提升了运行时性能!首先和C++模版(Template)做个比较,前者编译时不展开而运行时(JIT)展开,后者编译时展开。前者在展开时会做一定的优化,比如针对所有的引用类型作为泛型参数,泛型只被JIT编译成一份本地代码(native code),而后者对每一种模版参数展开一次。这意味着C++的二进制(binary)文件会更大且运行时占据更多内存。顺便一提,Java的泛型行为和C++类似。然而,当泛型遇到值类型参数时,则针对每一种值类型展开成不同的本地代码,因为CLR的原生类型(premitive types)数据长度不一样,而且CLR对原生类型的汇编操作指令各不相同。而引用类型则一律当作指针来操作,其数据长度为32位(bit)或64位--根据操作系统不同。
泛型极大程度的改善了CLR的性能和稳定性,应极力用之。