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

为何struct中string引用类型赋值后foo1与foo2的Bar值不同?(.NET6/C#10)

问题解答

核心原因是struct是值类型,赋值时会创建整个实例的完整副本,而不是像引用类型那样只拷贝对象引用。我们一步步拆解你的代码执行过程:

  1. 执行var foo1 = new Foo(); foo1.Bar = "test";

    • 栈上创建了一个Foo值类型实例foo1,它的Bar字段存储着指向字符串"test"的引用。
  2. 执行var foo2 = foo1;

    • 这一步是值拷贝操作:把foo1整个struct的所有内容(包括Bar里的那个引用)完整复制到新的Foo实例foo2中。此时foo1.Bar和foo2.Bar确实指向同一个"test"字符串。
  3. 执行foo2.Bar = "test2";

    • 这是给foo2这个独立副本的Bar字段重新赋值,让它指向新的字符串"test2"。而foo1的Bar字段仍然保留着指向"test"的原始引用,两者互不影响。

如果把Foo改成class(引用类型),那foo2 = foo1就是拷贝对象引用,此时修改foo2.Bar会同步影响foo1.Bar——但struct作为值类型,从赋值的那一刻起,foo1和foo2就是两个完全独立的实例了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 07:15:36