for loop'在一个实例中更改数组中的多个值
本文关键字:实例 数组 一个 loop for | 更新日期: 2023-09-27 18:06:13
我在express 2010 visual c#中的调试器选项(红点)中逐行工作。这个循环是分配生物[2].sprite。位置和生物[3].精灵。在相同的实例中,当我等于2时,指向相同向量(100,320)的位置。
进一步的测试表明,当i = 3时,同样的情况也会发生,然后当i = 4时,所有的2、3和4同时变成同一个向量。
有任何关于什么原因导致这个的建议,感觉像一个bug,现在想想,我应该尝试一个不同的变量,也许它被用在其他地方。
public class GameImages
{
//Image Diminsions
public Texture2D texture;
//Images position on the Viewport
public Vector2 position = new Vector2(0,0);
//Color
public Microsoft.Xna.Framework.Color color = Microsoft.Xna.Framework.Color.White;
}
public class CreaturesAttributes
{
//Image
public GameImages sprite;
//Level
public double Level;
}
CreaturesAttributes[] creatures = new CreaturesAttributes[100];
public void LoadTeam()
{
int j = 0;
for (int i = 1; i < creatures.Length; i++)
{
if (creatures[i].Color1 != null)
{
creatures[i].sprite.position = new Vector2(j, 320);
j += 100;
}
else
{
i = creatures.Length;
}
}
}
protected override void Initialize()
{
for (int i = 0; i < creatures.Length; i++)
{
creatures[i] = new CreaturesAttributes();
creatures[i].sprite = new GameImages();
}
}
这是因为您可能将所有数组元素初始化为指向单个实例:
var newCreature = new Creature(/* ... */);
for (int i = 0; i < creatures.Length; i++) {
creatures[i] = newCreature;
}
或者你可能创造了多个生物,但使用相同的"精灵":
var defaultSprite = new Sprite(/* ... */);
for (int i = 0; i < creatures.Length; i++) {
creatures[i] = new Creature();
creatures[i].sprite = defaultSprite;
}
或者sprite
或position
是静态字段:
static Sprite sprite;
//or
static Vector2 position;
以上所有内容都将导致你所有的突变和访问发生在同一个实例上,所以看起来改变一个就改变了所有的实例(而实际上你只是从多个地方引用一个单一的生物/精灵/位置)。
解决方案是确保字段不是静态的,并确保创建一个新的生物和生物。雪碧:
// No static fields, and new instances for each index
for (int i = 0; i < creatures.Length; i++) {
creatures[i] = new Creature();
creatures[i].sprite = new Sprite();
}