关于引用类型的一点疑问
请教各位高手,object是引用类型。可是为什么我下面的代码
object z = 156;
object m = z;
m = 123;
Console.WriteLine("{0},{1}",z,m);
Console.ReadKey();
输出的结果是156,123
请问这是为什么?
------解决方案--------------------详细说下:
关键是这句 object m = z;
你觉得 m 应该是 z 的引用。
或者你会这么写:object m = (object)z;
这样做其实是无效的。
你可能认为(object)z是把z转换成object,其实不是,因为这是隐式类型转换,其实是“把z当作object”,而不是把z转换为object,因此在它身上发生了一次装箱一次拆箱。
当它传给m的时候,它还是int。
------解决方案--------------------同意楼上的。这是因为装箱操作的机制造成的。
装箱操作的机制:
1、在托管堆中分配好内存。(同步块+方法表+值类型的字段)
2、将值类型的字段复制到托管堆中。
3、返回对象的地址。
m = 123;这是一个装箱的操作。
在装箱之前m和z确实都是指向一个托管堆中的。但是由于装箱操作的机制。重新分配了内存,重新返回对象的地址。之前指向156的引用就撤销了。
------解决方案--------------------m=123的过程中,在将123赋给m之前,关键的是第一步:分配好内存。因为首先是新分配了内存,所以123一定是装在新生成的内存中的。也就是说123和156现在是分别装在两个不同的内存之中的。调用的时候自然显示的是两个不同的结果。
很好的题目 确实比较容易出错。