知识点:引用类型、值类型、装箱、拆箱ide
CLR支持两种类型:引用类型和值类型。引用类型在堆上分配内存,值类型在线程栈上分配内存。值类型与引用类型以下所示:spa
值类型对象有两种表示形式:未装箱和已装箱。将一个值类型的变量付给另外一个值类型变量,会执行一次逐字段的复制。线程
装箱:将一个值类型转换为一个引用类型称为装箱。装箱会发生以下操做:指针
一、在托管堆中分配好内存。分配的内存大小等于值类型各个字段须要的内存大小之和加上类型对象指针和同步块索引须要的内存量。code
二、值类型的字段复制到新分配的堆内存。orm
三、返回对象的地址。对象
拆箱:将一个引用类型转换为值类型,首先值类型的内存分配在线程栈中,而引用类型的内存分配在托管堆中,因此须要把引用类型中的全部字段都复制到线程栈中。CLR经过两个步骤来完成这个复制操做。blog
一、获取已装箱的对象中的各个字段的地址。这个过程称为拆箱。索引
二、将这些字段包含的值从托管堆复制到线程栈中。内存
经过下面例子来深刻理解装箱和拆箱:
internal struct Point { private int _x, _y; public Point(int x = 0, int y = 0) { _x = x; _y = y; } public void Change(int x = 0, int y = 0) { _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:1,y:1); Console.WriteLine(p); p.Change(x:2,y:2); Console.WriteLine(p); Object o = p; Console.WriteLine(o); ((Point)o).Change(x:3,y:3); //这个执行结果是多少?为何? Console.WriteLine(o); Console.ReadLine(); } }