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
相关产品推荐
相关产品推荐

