为何引用指向不同值?求解释此C#代码输出5的原因
为什么这段代码输出5?
先看你的代码:
object x = 5; object y = x; x = 10; Console.WriteLine(y);
拆解执行过程就能明白原因:
第一步:
object x = 5;
确实发生了装箱:值类型int的5被包装成一个object实例存到堆上,栈上的变量x保存着这个堆对象的引用。第二步:
object y = x;
这是复制引用,此时x和y都指向堆上同一个装箱后的5对象。第三步:
x = 10;
重点在这:你不是修改原来那个装箱对象的值,而是重新执行了一次装箱操作——把int值10包装成一个全新的object实例,然后让x的引用指向这个新对象。原来的装箱5对象完全没被改动,y依然指向它。
所以最后Console.WriteLine(y)输出的还是最初的5。
核心点:值类型的装箱对象是不可变的,你无法直接修改装箱后的值。如果是自定义引用类型(比如一个带属性的类),修改对象的成员属性会让所有指向它的引用看到变化,但值类型的赋值操作只会生成新的装箱对象,不会修改原有对象。
内容的提问来源于stack exchange,提问作者Zolter Zolter
相关产品推荐
相关产品推荐

