我试图理解/协调我对使用列表和数组进行链接时 C# 结构如何运作的理解。我按照埃里克在这篇文章中的解释 Performance of array of struct types
但我要更进一步。
struct Foo { public int A; public int B; public Foo[] ChildFoos; }
Foo parentFoo = new Foo();
parentFoo.ChildFoos = new Foo[1];
parentFoo.ChildFoos[0] = new Foo();
List<Foo> list = new List<Foo>();
list.Add(parentFoo);
但是当您链接调用时,行为会发生变化。 list[0] 应该返回一个值(不是变量),而 ChildFoos[0] 应该返回一个变量。
list[0].ChildFoos[0].A = 4545;
在这种情况下,似乎正在发生的事情是 list[0] 被视为变量而不是值。 ChildFoos[0].A 在列表中的 parentFoo 中维护它的新值。这怎么可能?
将此与尝试在无法编译的父 Foo 结构上设置 A 进行比较。
list[0].A = 877;
这不会编译
最佳答案
因此,正如您正确指出的那样,list[0]
是列表中值的副本。它是一个值,而不是一个变量。 struct
中的值之一是 ChildFoos
。该字段的值不是一大堆 Foo 实例;相反,它是对存储在别处的一堆信息的引用(因为数组是引用类型)。您返回的 Foo
实例的副本具有列表内部实例所具有的引用的副本。
如果您要改变引用本身,比如将一个新数组分配给ChildFoos
,您会看到与尝试改变时相同的错误该结构的任何其他字段,例如当您尝试改变 A
时。因为它只是读取结构存储的引用的值(而不是改变结构实例),然后去获取该数组中的第一个项目,并且由于数组索引器返回一个变量,而不是一个值(同样,正如你在问题中正确指出的那样)改变返回的 Foo
实例正在改变数组中的实例,因为它不是副本,所以当你访问同一个数组时稍后,您将再次观察到变化。
关于c# - 结构值列表和数组与变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47702961/