我有一个结构列表。在循环中我试图修改对象的属性,这正在发生,但是当我(在 Visual Studio 中快速查看)查看列表对象时,新值没有反射(reflect)出来。是是因为结构的对象在集合中时不能修改吗? 我正在使用带有结构的泛型列表作为列表中的类型
最佳答案
您在结构的上下文中提到“修改对象的属性”,但重要的是结构不是对象。其他人已经回答了关于结构被复制(和更改被丢弃)的问题,但更进一步,这里的真正问题是你有一个可变的(可变的)完全结构。除非您使用的是 XNA(或类似的),否则根本没有必要。
如果你想改变属性,把它变成一个类:
public class Foo {
public string Bar {get;set;}
}
现在这是一个引用类型,您的更改 (obj.Bar = "abc";
) 将通过 foreach 保留。如果你真的想要/需要一个结构,让它不可变:
public struct Foo {
private readonly string bar;
public string Bar { get {return bar; }}
public Foo(string bar) {this.bar = bar;}
}
现在您不能犯更改副本值的错误;您将不得不使用索引器来交换值 (list[i] = new Foo("abc");
)。更冗长(并且您不能使用 foreach
),但正确。
但是 IMO,使用类。老实说,结构非常罕见。如果您不确定:上课。
关于c# - 无法在循环中修改结构的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2152192/