【问题标题】:Modifying value of object within foreach loop在 foreach 循环中修改对象的值
【发布时间】:2012-02-27 19:42:26
【问题描述】:

我定义了一个名为敌人的矩形列表,我试图通过列表中的矩形移动并减少它们的 X 值,但是我收到一个错误“无法修改 'i' 因为它是一个 foreach 迭代变量。”我想知道这有什么问题以及是否有正确的方法。

        foreach (Rectangle i in enemies)
        {

            i.X --:

        }

【问题讨论】:

  • 听起来你正在使用一个邪恶的可变结构。不要。
  • 您对使它们成为敌人的矩形有什么看法? :/ 更重要的是,这是 System.Drawing.Rectangle 结构,是您的自定义结构,还是 _____?
  • 我认为您指的是 XNA Rectange(它是一个结构)而不是 WPF Rectangle 类,所以我添加了 xna 作为标签。
  • @AnthonyPegram:“你有什么反对让他们成为敌人的矩形?” -- 这让我有点笑了。

标签: c# xna foreach


【解决方案1】:

值类型按值复制;这就是为什么它们被称为“值类型”。当您这样做时,您正在制作矩形的副本,然后更改副本。现在,恰好 foreach 循环生成了一个值的不可变副本,并告诉您不能更改它,这很好,因为它刚刚捕获了您的错误。如果您一直在对可变副本进行更改,您可能很长时间都没有发现错误。

您的 Enemy 类型应该是引用类型,而不是值类型。让敌人包含一个矩形,而不是成为一个矩形。然后,您可以改变对敌人的引用中的矩形。

【讨论】:

  • 虽然我同意 Enemy 可能应该是一个引用类型,但对于 XNA 有一个小警告:如果你想在 Xbox 360 上运行,垃圾收集器是一个大问题,即为什么可变结构在那里更常见。尝试制作一个有很多敌人的游戏(例如,几何战争)可能是一个性能挑战(尽管我认为对象池比可变结构更有意义)。
  • @MichaelStum:请记住,我猜测原始发布者使用的是 XNA,所以我添加了该标签。这是有道理的,因为在 XNA Rectangle 中是一个结构,但是 OP 使用另一个结构 Rectangle 的可能性仍然很小?也许……
  • 不,你假设它是 XNA 是正确的 :) 感谢大家的帮助,我最近才开始使用它。
猜你喜欢
  • 2020-06-05
  • 2013-07-14
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
相关资源
最近更新 更多