将对象添加到列表,更改所有其他列表对象

时间:2017-09-08 08:29:03

标签: c# list

我正在尝试将动物添加到我的动物列表中,但最后添加的动物的值将是列表中的所有动物。

List<Animal> animals = new List<Animal>();
public bool AddAnimal(Animal animal)
        {
            animals.Add(animal); 
            return true;
        } 

Animal animal = new Animal();
private void btnAddAnimal_Click(object sender, RoutedEventArgs e)
        {
            animal.AnimalSize = Size.large;
            animal.Carnivore = true;
            AddAnimal(animal);
        }

这是清单: 大小食肉动物 - 大真实

private void btnAddAnimal_Click(object sender, RoutedEventArgs e)
        {
            animal.AnimalSize = Size.large;
            animal.Carnivore = false;
            AddAnimal(animal);
        }

这是我添加草食动物后我的动物名单所发生的事情:

  • 大小食肉动物
    • 大错误
    • 大错误

2 个答案:

答案 0 :(得分:5)

好吧,你实际上并没有添加一个新的动物,你只是在修改你拥有的动物。如果要添加新动物,则必须创建新对象:

private void btnAddAnimal_Click(object sender, RoutedEventArgs e)
{
  Animal animal = new Animal();
  animal.AnimalSize = Size.large;
  animal.Carnivore = true;
  AddAnimal(animal);
}

答案 1 :(得分:5)

您创建动物一次(在您的方法之外),然后只更改其属性。因此,您的列表如下所示:

      +--------+
  +-> | Animal |
  |   +--------+
  |    ^    ^
  |    |    |
 [0], [1], [2], ...

他们都指向相同的动物。那显然不是你想要的。你想要的是这个:

      +--------+
  +-> | Animal |
  |   +--------+
  |              +--------+
  |         +--> | Animal |
  |         |    +--------+
 [0], [1], [2], ...
       |
       v
      +--------+
      | Animal |
      +--------+

要解决此问题,请每次创建新动物

// Animal animal = new Animal(); <-- we don't need this any more

private void btnAddAnimal_Click(object sender, RoutedEventArgs e)
{
    Animal animal = new Animal();  // <-- but we need it here

    animal.AnimalSize = Size.large;
    animal.Carnivore = true;
    AddAnimal(animal);
}