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();    
        }
    }

for loop'在一个实例中更改数组中的多个值

这是因为您可能将所有数组元素初始化为指向单个实例:

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;
}

或者spriteposition是静态字段:

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();
}