c# - 无法在循环中修改结构的对象

标签 c# collections

我有一个结构列表。在循环中我试图修改对象的属性,这正在发生,但是当我(在 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/

相关文章:

java - 按值对 Map<Key, Value> 进行排序

java - 为什么ArrayList中的set方法不更新modCount?

java - 如何实现返回 "enumeration"对象的函数?

c# - Debugger Canvas - 与 Visual Studio 2013/2015 兼容的类似插件

c# - 如何创建为 SelectMany resultSelector 返回匿名类型的 C# LambdaExpression

停靠工具窗口的 C# .NET 控件?

c# - 从通用类型加载通用集合

c# - 如何使机器独立和 .Net 框架(依赖项)独立于 .Net 的 'EXE' 文件

c# - 如何在 C# 的 LabVIEW 中设置集群中变量的值?

java - 迭代器如何在并发 HashMap 中实现故障安全