一、类型分类:
1:值类型,
(1)表示变量引用的位置就是值在内存中实际存储的位置;表一个变量的值赋给另一个变量,会在新变量所在的位置创建原始变量的值的一个内存副本,它不能引用与第一个变量相同的内存位置,
所以更改其中一个不会影响到另一个变量的值;
(2)将一个值类型传给一个方法,也会生成一个内存的副本,在方法的内部对参数进行修改,并不会影响到原始调用者的原始值。
值类开存储在称为”栈“的内存空间里面。
2:引用类型
(1)引用类型指向的是数据存储的位置,也就是存放的是一个内存地址,从这个内存地址才能找到真正的数据,因此,在访问数据时,先从引用变量中取得所要的内存位置,再跳转到内存位置取得
取得真正的数据;引用类型指向的内存区域叫做”堆“,也就是存储真正数据的位置;
(2)一个引用类型变量赋值给另一个引用类型变量时,只会多出一个地址的内存副本,而二者指向的同一个在”堆“中真正的数据并不会变化;所以两个变量可以引用相同数据,故其中一个变量改变
也会使另一个变量引用的数据改变。
说明:除了string object,所有C#的基本数据类型都是值类型。
二 装箱(boxing)
1,当一个值类型转换为实现的某个接口或者对象时,这个转型的过程称为”装箱“。分为以下三个步骤:
(1) 首先在”堆“分配好所要的内存,它将用来存放值类型的数据以及少许的额外开销(方法表指针等);
(2) 接着发生一次内存复制,把”栈“上值类型的数据复制到”堆“上分配好的位置上;
(3) 最后,对象或接口引用得到更新,指向堆上的位置。
2,相反的转化过程叫做”拆箱“(unboxing),
3,说明:box对性能有很大的影响,因为要程序要注意有很多不容易被发现的大量的装箱和拆箱的操作。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhuoruling/archive/2009/12/17/5028337.aspx