为何struct中string引用类型赋值后foo1与foo2的Bar值不同?(.NET6/C#10)
问题解答
核心原因是struct是值类型,赋值时会创建整个实例的完整副本,而不是像引用类型那样只拷贝对象引用。我们一步步拆解你的代码执行过程:
执行
var foo1 = new Foo(); foo1.Bar = "test";- 栈上创建了一个
Foo值类型实例foo1,它的Bar字段存储着指向字符串"test"的引用。
- 栈上创建了一个
执行
var foo2 = foo1;- 这一步是值拷贝操作:把
foo1整个struct的所有内容(包括Bar里的那个引用)完整复制到新的Foo实例foo2中。此时foo1.Bar和foo2.Bar确实指向同一个"test"字符串。
- 这一步是值拷贝操作:把
执行
foo2.Bar = "test2";- 这是给
foo2这个独立副本的Bar字段重新赋值,让它指向新的字符串"test2"。而foo1的Bar字段仍然保留着指向"test"的原始引用,两者互不影响。
- 这是给
如果把Foo改成class(引用类型),那foo2 = foo1就是拷贝对象引用,此时修改foo2.Bar会同步影响foo1.Bar——但struct作为值类型,从赋值的那一刻起,foo1和foo2就是两个完全独立的实例了。
内容的提问来源于stack exchange,提问作者Milton Sampaio
相关产品推荐
相关产品推荐

