C#中的基类object不应该是引用类型的吗? 是!
object a = 1;
object b = a;
a = 2;
Console.Write(b);
Console.Read();
那这段代码,为什么输出的是1,b和a引用同一个地方,a改了为什么b没改。
object b = a; 实际上是拷贝了一个a的引用,所以修改了a不会修改b。
object a = 1;
像这样将值类型赋值给引用类型称为装箱
可以理解为创建了一个箱子对象,将1装入
object b = a;
这一句的时候b和a确实是引用同一个箱子
但是,当执行了
a = 2;
就构建了一个新的箱子对象并将2装入
所以这时候a和b变成了不同的引用
a 指向了新的堆空间,b指向的堆空间不变。
本质:
装箱:将值类型转为 引用类型
拆箱:将引用类型转为 值类型
值类型:在栈上。
引用类型:在堆上存实际值,在栈上保留索引地址。当引用类型指向新的值,就是修改了栈上的指向的新的堆的地址,原来的堆上的地址,如果没有被其他栈 地址引用 ,就会被垃圾回收。