c# - 结构值列表和数组与变量

标签 c# arrays struct

我试图理解/协调我对使用列表和数组进行链接时 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/

相关文章:

php - 访问返回数组

Java:在带有 for 循环的数组元素上使用变元方法,不起作用

arrays - 在awk中,当遇到新字符串时如何增加数组索引?

c - 将数组与结构传递给函数

c++ - 错误 : invalid use of template-name ‘ExTree’ without an argument list || How do if fix this?(初学者)

c# - 反序列化 XML

c# - 移除不会再次运行的 quartz 触发器

c# - 从 C# 中的路径拆分文件名和扩展名

c# - 将查询结果传递给 View 的最佳实践?

c - 如何在C中对一组结构进行排序