You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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未被修改,所以输出2
  • b.Data:b指向0x800000,对象Data已改为4,输出4
  • c.Data:c同样指向0x800000,输出4

核心结论

引用类型变量存储的是堆对象的内存地址,赋值操作只是地址值的复制,变量之间不会建立"自动同步"的关联。后续改变某个变量的指向,不会影响其他已经持有旧地址的变量。

内容的提问来源于stack exchange,提问作者zblago

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 17:31:01