CLR值类型和引用类型

时间:2023-03-09 03:10:45
CLR值类型和引用类型

知识点:引用类型、值类型、装箱、拆箱

CLR支持两种类型:引用类型和值类型。引用类型在堆上分配内存,值类型在线程栈上分配内存。值类型与引用类型如下所示:

CLR值类型和引用类型

值类型对象有两种表示形式:未装箱和已装箱。将一个值类型的变量付给另一个值类型变量,会执行一次逐字段的复制。

装箱:将一个值类型转换为一个引用类型称为装箱。装箱会发生如下操作:

1、在托管堆中分配好内存。分配的内存大小等于值类型各个字段需要的内存大小之和加上类型对象指针和同步块索引需要的内存量。

2、值类型的字段复制到新分配的堆内存。

3、返回对象的地址。

拆箱:将一个引用类型转换为值类型,首先值类型的内存分配在线程栈中,而引用类型的内存分配在托管堆中,所以需要把引用类型中的所有字段都复制到线程栈中。CLR通过两个步骤来完成这个复制操作。

1、获取已装箱的对象中的各个字段的地址。这个过程称为拆箱。

2、将这些字段包含的值从托管堆复制到线程栈中。

通过下面例子来深入理解装箱和拆箱:

internal struct Point
{
private int _x, _y; public Point(int x = , int y = )
{
_x = x;
_y = y;
} public void Change(int x = , int y = )
{
_x = x;
_y = y;
} public override string ToString()
{
return string.Format("{0},{1}",_x,_y);
}
}
class Program
{
static void Main(string[] args)
{
Point p = new Point(x:,y:);
Console.WriteLine(p);
p.Change(x:,y:);
Console.WriteLine(p);
Object o = p;
Console.WriteLine(o);
((Point)o).Change(x:,y:);
//这个执行结果是多少?为什么?
Console.WriteLine(o);
Console.ReadLine(); }
}