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

C#引用类型对象赋值疑问:obj2=obj1是更新值还是指向obj1?

关于C#引用类型赋值的清晰解释

嘿,这个问题戳中了C#里引用类型的核心逻辑,咱们一步步拆解清楚:

首先得明确:你定义的human是引用类型(C#里class默认都是引用类型),所以obj1、obj2这类变量本质是「引用指针」——它们本身不存储对象的具体数据,只存堆上对象的内存地址。

咱们跟着你的代码流程走一遍:

  • 第一步:human obj1 = new human();
    堆上生成一个全新的human对象(此时静态变量x从0变成1,这个对象的id就是1),obj1变量保存的是这个对象在堆上的地址。
  • 第二步:human obj2 = new human();
    堆上又生成第二个human对象(x变成2,这个对象的id是2),obj2变量保存的是这个新对象的地址。
  • 第三步:obj2 = obj1;
    这一步的操作是把obj1里存储的地址值,直接复制给obj2。也就是说:
    • obj2不再指向原来那个id=2的对象了;
    • 现在obj2和obj1完全指向堆上同一个id=1的对象;
    • 原来那个id=2的对象,因为没有任何引用变量再指向它,后续会被.NET的垃圾回收器(GC)自动清理掉。

简单总结:不是更新obj2原对象的值,而是obj2直接改指向,和obj1引用同一个对象。

如果是值类型(比如struct),赋值才会复制对象的所有数据,但class作为引用类型,赋值操作始终是传递地址,也就是改变引用指向。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:50:08