扯远了,谈谈值类型跟引用类型。
在写这两个变量类型之前,首先要理解另外两个概念:栈和堆
那什么是栈和堆呢?
计算机的内存从概念上分,会有许许多多的独立的块,栈和堆就是其中的两种内存块了。
平时当我们调用一个方法时,假如这方法有参数的话,那么我们就需要为这个方法的参数跟方法所用到的变量分配内存。那么,
参数跟变量的内存就是从栈中获得了,当这个方法结束的时候,这些参数跟变量所占用的内存就会自动释放回栈中。
当我们使用new创建(实例化)一个对象(类)时,这时候就要分配到对象的内存,那么呢,这个对象的内存就是从堆中获得,当这个对象使用完成(异常也算)后,刚好相反,对象的内存是并不会释放回堆中的。怎么处理里?我们都知道.net有个垃圾回收机制的。 当然,我们编码的时候一些相于占资源的对象,一般都有我们自己分配释放。
好了,理解那两个概念之后,再写值类型跟引用类型就容易理解多了
值类型:
值类型的变量本身就是含有赋予给它的数值的,它的变量本身及保存的数据都存储在栈的内存块当中,比如: int、float、bool这些类型,以及用struct定义的类型。
当声明一个值类型时,必须对它初始化(给变量赋值)才能使用。否则,如int型,将边编译都编译不过(后补:字眼上的问题,当然,我的意思不是说这样编译不过一定就是值类型,这里打个比方也许不太恰当,因为大多都编译不过的)
引用类型:
即然值类型是存在栈的内存块当中,那么即然上面先提到堆,引用类型当然是分配到堆上的对象或者数据变量喽,根据官方一点的解释就是引用类型的变量只包括对其所表示的数据引用(如果对这句不太明白的话,看下以下的的例子)。
打个比方,我们从类操作中很容易明白,多个引用类型变量(如:类变量)是可以引用同一个对象(类)的,所以,我们操作一个引用类型(如:类变量)时,有可能会影响到引用同一对象或者数据的其他变量了,就很好理解,引用类型的对象总是在进程堆中分配(动态分配)的。
比如使用了关键字new初始化的数值类型变量的,因为当使用new对其初始化后,这个关键字就在堆为该变量分配了内存块,如下例中,变量_obj就引用了一个Sample类型的对象
在所接触大多数.net(c#)开发人员的理解当中, 常常由于是用struct来定义(值类型)还是用class(引用类型)来定义的。当然,这虽然不是一个科学的办法,但也不失为了一个办法。
值类型就是现金,要用直接用;引用类型是存折,要用还得先去银行取现。
声明一个值类型变量,编译器会在栈上分配一个空间,这个空间对应着该值类型变量,空间里存储的就是该变量的值。引用类型的实例分配在堆上,新建一个引用类型实例,得到的变量值对应的是该实例的内存分配地址,这就像您的银行账号一样。
具体哪些类型是值类型哪些是引用类型,大家翻翻书,背一背就好了,不过我想,做过一段时间的开发,即使您背不了书上教条的定义,也不会把值类型和引用类型搞混的。