C#引用类型多变量赋值疑问:修改b.Data后a.Data为何未变化?
C#引用类型赋值的核心逻辑解析
你的理解完全正确,以下是更清晰的分步拆解:
初始对象与内存状态
首先执行对象初始化代码:
public class Node { public int Data {get;set;} } var a = new Node() { Data = 1 }; // 指向内存地址 0x600000 var b = new Node() { Data = 2 }; // 指向内存地址 0x700000 var c = new Node() { Data = 3 }; // 指向内存地址 0x800000
此时三个变量各自指向独立的堆对象:
a→ 0x600000(对象Data=1)b→ 0x700000(对象Data=2)c→ 0x800000(对象Data=3)
赋值操作的本质:复制地址而非建立关联
执行赋值语句时,仅复制变量中存储的内存地址,不会让变量之间形成链式依赖:
a = b; // 将b当前的地址(0x700000)复制给a,a现在直接指向原b的对象 b = c; // 将c当前的地址(0x800000)复制给b,b现在直接指向原c的对象
这一步完成后:
a的指向固定为0x700000,后续b的指向变化不会影响它b和c同时指向0x800000
修改对象属性的影响
执行b.Data = 4;时,是通过b存储的地址(0x800000)找到对应堆对象,修改其Data值:
b.Data = 4;
此时各变量的输出逻辑:
a.Data:a仍指向0x700000,该对象的Data未被修改,所以输出2b.Data:b指向0x800000,对象Data已改为4,输出4c.Data:c同样指向0x800000,输出4
核心结论
引用类型变量存储的是堆对象的内存地址,赋值操作只是地址值的复制,变量之间不会建立"自动同步"的关联。后续改变某个变量的指向,不会影响其他已经持有旧地址的变量。
内容的提问来源于stack exchange,提问作者zblago
相关产品推荐
相关产品推荐

