gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:36:21 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com