值类型和引用类型

 

数据类型分为两种:值类型和引用类型,这两种类型的对象在内存的存储方式不同。

定义:  

      引用类型:表示操作的对象是同一个,即当传一个参数给另一个方法时,在另一个方法中改变这个变量的值,那么调用这个方法时传入的值也将发生变化。

      值类型:表示复制一个当前变量传递给方法,在方法中改变这个值时,最初生命的变量值不会改变。

值类型

      值类型及基本数据类型,常被分为四类八种:

            四类:整型,浮点型,字符型,逻辑型

            八种:1,整型3种 byte, short, int, long

                     2,浮点型 float, double

                     3,字符型 char

                     4,逻辑型 boolean

引用类型

       除了四类八种的基本类型,其他数据类型都是引用类型,例如:string类型,object类型等。

传递:

       值传递:基本数据类型复制都属于值传递。传递的是实实在在的变量值,是原参数的拷贝,实参传递给形参的值,形参发生变化而不影响实参。

       引用传递:引用类型之间的赋值属于引用传递。传递的对象是引用的地址,即将实参的地址传递给形参,形参改变了实参也相应发生变化,因为指向同一个地址。

存储:

   1.    值类型:只需一段单独的内存,用于存储时间的数据。

          引用类型:需要两端内存:

                第一段:实际数据,总是位于堆中

                第二段:一个引用,指向数据在堆中的存储位置

          数据如果不是其他类型的成员就会像下图一样存贮,对于值类型数据放在栈中。对于引用类型数据放在堆中而引用放在栈中

    2.存储引用类型对象的成员

          引用类型对象的数据始终存储在堆中,如下图。

          值类型数据,或引用类型数据的引用可以放在堆里,也可以放在栈里。

例如:引用类型的对象名称为MyType,有两个成员:一个值类型成员和一个引用类型成员,将如何存储呢?

        对于一个引用类型,其实例的数据始终放在堆里。既然两个成员都是对象数据的一部分,那么他们都会被放在堆里,无论是值类型还是引用类型 如图:

   

装箱和拆箱

     装箱就是值类型转化为引用类型的过程。将一个值类型变量装箱成一个引用类型变量,首先会在托管堆上为新的引用类型变量分配内存空间,然后将值类型变量拷贝到托管堆上新分配的对象内存中,然后返回新分配的对象内存地址。  

例如:
int val = 100;
object obj = val;
Console.WriteLine (“对象的值 = {0}",obj);
 
     拆箱操作即是装箱的逆操作,拆箱的过程,是将值类型转换为引用类型,再由引用类型转换为值类型的过程。
例如:
int val = 100;
object obj = val;
int num = (int) obj;
Console.WriteLine ("num: {0}",num);
原文地址:https://www.cnblogs.com/xishuqingchun/p/3674032.html