为何在类中使用struct时值不会发生变化?
关于Counter结构体修改不生效的原因分析
嘿,我刚好看到这个问题,来聊聊我的分析——你猜的完全没错,核心就是**装箱(Boxing)和拆箱(Unboxing)**的机制在起作用!
咱们一步步拆解:
首先看这行代码:
public readonly object counter = new Counter();
这里Counter是值类型结构体,把它赋值给object类型变量时,会触发装箱操作:系统会在堆上创建一个对象,把Counter的实例数据拷贝进去,然后counter这个引用就指向堆上的这个装箱对象。再看拆箱操作:
((Counter)riddle.counter)
每次执行这个强制转换时,都会触发拆箱——注意,拆箱不是直接返回堆上的那个结构体实例,而是把堆上装箱对象里的Counter数据拷贝一份,生成一个新的Counter值类型实例放在栈上。
这就解释了为什么A行的操作不会影响B行:
A行修改的是拆箱后得到的那个栈上临时Counter实例,而B行再次拆箱时,又会从堆上的原装箱对象里拷贝一份全新的Counter实例。两次拆箱得到的是完全独立的两个实例,互相没有关联,自然A行的修改不会体现在B行里。
内容的提问来源于stack exchange,提问作者Netsphere Wu
相关产品推荐
相关产品推荐

