c#装箱和拆箱过程

1、装箱和拆箱

1)装箱: 值类型转换为等价的引用类型的过程

  int a = 100;
        Object obja1 = (Object)a;
        Object obja2 = (Object)a;

对应内存的中图如下:
c#装箱和拆箱过程_第1张图片

这个过程分为三步
第一步、在堆上为新的对象实例分配内存。该对象实例包含数据,但没有名称,内存中的变化如下:
c#装箱和拆箱过程_第2张图片

第二步、在栈上值类型变量的值复制到堆上的对象中,内存中的变化如下:
c#装箱和拆箱过程_第3张图片

第三步、将堆上创建的对象的地址返回给引用类型变量,内存中的变化如下:
c#装箱和拆箱过程_第4张图片
所以:
代码:

 Console.WriteLine(Point.ReferenceEquals(obja1, obja2));

输出:

false

说明:
ReferenceEquals指的是两个实例(对象)是否相同,因为在堆上的内存不同,所以实例不同,所以返回false。

2)拆箱:引用类型转换成值类型的过程
int b = (int)obja2;
获取已装箱的对象的地址,然后将值从堆上的对象中复制到堆栈上的值变量中,内存中的变化如下:
c#装箱和拆箱过程_第5张图片

你可能感兴趣的:(c#)