转自:http://www.cnblogs.com/kakimsun/archive/2010/05/09/1730828.html
在写这两个变量类型之前,首先要理解另外两个概念:栈和堆
那什么是栈和堆呢?
计算机的内存从概念上分,会有许许多多的独立的块,栈和堆就是其中的两种内存块了。
平时当我们调用一个方法时,假如这方法有参数的话,那么我们就需要为这个方法的参数跟方法所用到的变量分配内存。那么,
参数跟变量的内存就是从栈中获得了,当这个方法结束的时候,这些参数跟变量所占用的内存就会自动释放回栈中。
当我们使用new创建(实例化)一个对象(类)时,这时候就要分配到对象的内存,那么呢,这个对象的内存就是从堆中获得,当这个对象使用完成(异常也算)后,刚好相反,对象的内存是并不会释放回堆中的。怎么处理里?我们都知道.net有个垃圾回收机制的。 当然,我们编码的时候一些相于占资源的对象,一般都有我们自己分配释放。
好了,理解那两个概念之后,再写值类型跟引用类型就容易理解多了
值类型:
值类型的变量本身就是含有赋予给它的数值的,它的变量本身及保存的数据都存储在栈的内存块当中,比如: int、float、bool这些类型,以及用struct定义的类型。
当声明一个值类型时,必须对它初始化(给变量赋值)才能使用。否则,如int型,将边编译都编译不过(后补:字眼上的问题,当然,我的意思不是说这样编译不过一定就是值类型,这里打个比方也许不太恰当,因为大多都编译不过的)
引用类型:
即然值类型是存在栈的内存块当中,那么即然上面先提到堆,引用类型当然是分配到堆上的对象或者数据变量喽,根据官方一点的解释就是引用类型的变量只包括对其所表示的数据引用(如果对这句不太明白的话,看下以下的的例子)。
打个比方,我们从类操作中很容易明白,多个引用类型变量(如:类变量)是可以引用同一个对象(类)的,所以,我们操作一个引用类型(如:类变量)时,有可能会影响到引用同一对象或者数据的其他变量了,就很好理解,引用类型的对象总是在进程堆中分配(动态分配)的。
比如使用了关键字new初始化的数值类型变量的,因为当使用new对其初始化后,这个关键字就在堆为该变量分配了内存块,如下例中,变量_obj就引用了一个Sample类型的对象