先分析一下值类型与引用类型
值类型: Int32 i =4; 【变量i是值类型,被分配在栈上,变量包含变量实例,使用效率高】
引用类型: object o = i; 【变量o是引用类型,被分配在托管堆,变量包含实例的指针,通过此指针引用其实例】
引用类型性能要比值类型差很多,因此尽量使用值类型,而少使用引用类型。
装箱
1
2
3
|
Int32 i =4; 定义一个值类型
objct o = i; [装箱]这个值类型被复制并分配到托管堆,并把它转成引用类型O,这一个过程将会造成性能损失。
|
拆箱
1
2
3
4
5
|
Int32 i =4; 定义一个值类型
objct o = i; 转成引用类型O
Int32 n = (Int32)O;[拆箱]将托管堆中的引用类型实例复制到栈中,转为值类型n
|
由此可见,装箱和拆箱是要尽量避免的操作。
同时,尽可能少用Array,它的ADD操作会将值类型变量转为引用类型,而泛型List则不会,它是一个增强版的Array,它可以直接添加值类型到List中。
1
2
3
4
5
|
Int32 i = 4; 定义值类型
Array a =
new
Array(); 定义一个集合
a.Add(i); 将值类型加入集合中,但是这一个过程会发生装箱。
|