C#引用类型和值类型的区别

 举个例子

      比如a1=18,这时候在内存中保存的是18,当把a1付给a2的时候,他们两个应用的是同一个内存空间,18会保存为a1的值,当把a2改为20是,应为a1和a2引用的是同一个值,所以a1也变成20了,这是引用类型。

      值类型是当把a1付给a2时 会为a2在开一块新的空间保存a1的值。当把a2改成20时就会在a2的空间保存20,和a1就没关系 a1a2的数值不会冲突。

  引用类型就是存折取钱时得到银行,值类型就是现金可以直接拿过来用。

值类型和引用类型的区别在于,值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。
  值类型变量直接把变量的值保存在堆栈中,引用类型的变量把实际数据的地址保存在堆栈中,而实际数据则保存在堆中。注意,堆和堆栈是两个不同的概念,在内存中的存储位置也不相同,堆一般用于存储可变长度的数据,如字符串类型;而堆栈则用于存储固定长度的数据,如整型类型的数据int(每个int变量占用四个字节)。由数据存储的位置可以得知,当把一个值变量赋给另一个值变量时,会在堆栈中保存两个完全相同的值;而把一个引用变量赋给另一个引用变量,则会在堆栈中保存对同一个堆位置的两个引用,即在堆栈中保存的是同一个堆的地址。在进行数据操作时,对于值类型,由于每个变量都有自己的值,因此对一个变量的操作不会影响到其它变量;对于引用类型的变量,对一个变量的数据进行操作就是对这个变量在堆中的数据进行操作,如果两个引用类型的变量引用同一个对象,实际含义就是它们在堆栈中保存的堆的地址相同,因此对一个变量的操作就会影响到引用同一个对象的另一个变量。

1、基本定义

基本数据类型包括:整型、浮点型、字符型、结构体、布尔型、日期时间、枚举类型等

引用类型包括:字符串、类、数组、接口等

堆定义:是一种特殊的树形数据结构,每个结点都有一个值,一般由程序员分配释放,属于动态分配的,若程序员不释放,程序结束时可能由OS回收

栈定义:是在进行操作时遵循后进先出规则的线性结构,在类加载中由系统静态分配的,存放函数的参数值,局部变量的值等,方法调用结束之后,立即释放

2、基本数据类型与引用类型之间区别

基本类型值指的是那些保存在栈内存中的简单数据段,即这种值完全保存在内存中的一个位置。

引用类型值则是指那些保存在堆内存中的对象,意思是变量中保存的实际上只是一个指针,这个指针指向内存中的另一个位置,该位置保存对象。

值类型的实例经常会存储在栈上的。但是也有特殊情况。如果某个类的实例有个值类型的字段,那么实际上该字段会和类实例保存在同一个地方,即堆中。不过引用类型的对象总是存储在堆中。

在将一个值赋给变量时,解析器必须确定这个值是基本类型值,还是引用类型值。基本数据类型的值在内存中分别占有固定大小的空间,因此可以把他们的值保存在栈内存中。对于保存基本数据类型的变量,我们可以说他们是按值访问的,因为我们操作的是它们实际保存的值。

如果赋给变量的是一个引用类型的值,则必须在堆内存中去为这个值分配空间。由于这种值的大小不固定,因此不能把它们保存到栈内存中。但内存地址的大小是固定的,因此可以将内存地址保存在栈内存中。这样,当查询引用类型的变量时,就可以首先从栈中读取内存地址,然后在“顺藤摸瓜”找到保存在堆中的值。对于这种查询方式,我们把它叫做按引用访问,因为我们操作的不是实际的值,而是被那个值所引用的对象。

 


原文地址:https://www.cnblogs.com/myspace2015/p/4690529.html