日期:2014-05-18  浏览次数:21046 次

关于引用类型的一点疑问
请教各位高手,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现在是分别装在两个不同的内存之中的。调用的时候自然显示的是两个不同的结果。
很好的题目 确实比较容易出错。