1.主要介绍了范型,首先特意用object类型和范型进行了对比
结构类:
– 性能问题:
• 值类型Push时要装箱处理,Pop时要取消装箱处理,造成更多的垃圾碎片,增加垃圾收集的负担
• 引用类型也有强制转换的开销
– 类型安全问题(更为严重)
• 编译时任务类型都可以转换成object,无法保证运行时的类型安全
范型和object类型的对比
2.范型的实现原理
左边说明范型其实只是保留了参数的占位符 <T>,右边可以看到实例化后生成了一个Stack'1<int32>类,如果实例化另外一个是其他类型的话,比如double,就会再IL生成另外一个类以供调用Stack'2<Double>类,依此类推,这样也就体现出了范型的好处:
• 一次性地开发、测试和部署代码,通过任何类型(包括将来的类型)来重用它
• 编译器支持和类型安全
• 不会强行对值类型进行装箱和取消装箱,或者对引用类型进行向下强制类型转换,所以性能得到显著提高
– 值类型,性能通常会提高200%
– 引用类型,在访问该类型时,可以预期性能最多提高100%(当然,整个应用程序的性能可能会提高,也可
能不会提高)
3.范型支持多个占位符,以支持多种类型参数
结构类:
public class Stack
{
object[] m_Items;
public void Push(object item)
{}
public object Pop()
{}
}
实例:{
object[] m_Items;
public void Push(object item)
{}
public object Pop()
{}
}
Stack stack = new Stack();
stack.Push(1);
stack.Push(2);
int number = (int)stack.Pop();
基于object解决方案存在的问题stack.Push(1);
stack.Push(2);
int number = (int)stack.Pop();
– 性能问题:
• 值类型Push时要装箱处理,Pop时要取消装箱处理,造成更多的垃圾碎片,增加垃圾收集的负担
• 引用类型也有强制转换的开销
– 类型安全问题(更为严重)
• 编译时任务类型都可以转换成object,无法保证运行时的类型安全
范型和object类型的对比
2.范型的实现原理
左边说明范型其实只是保留了参数的占位符 <T>,右边可以看到实例化后生成了一个Stack'1<int32>类,如果实例化另外一个是其他类型的话,比如double,就会再IL生成另外一个类以供调用Stack'2<Double>类,依此类推,这样也就体现出了范型的好处:
• 一次性地开发、测试和部署代码,通过任何类型(包括将来的类型)来重用它
• 编译器支持和类型安全
• 不会强行对值类型进行装箱和取消装箱,或者对引用类型进行向下强制类型转换,所以性能得到显著提高
– 值类型,性能通常会提高200%
– 引用类型,在访问该类型时,可以预期性能最多提高100%(当然,整个应用程序的性能可能会提高,也可
能不会提高)
3.范型支持多个占位符,以支持多种类型参数