2017-09-08 128 views
2

我试图将动物添加到我的动物列表中,但最后添加的动物的值将是列表中的所有动物。将对象添加到列表中,更改所有其他列表对象

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

这是在我加入草食动物对待我的动物名单发生了:

  • 大小食肉
    • 大虚假
    • 大假
+0

C#对不起,我会添加它马上 – daffy

+0

'animal'总是指向相同的内存地址 – izsl

回答

5

嘛,你实际上并没有增加新的动物,你只是修改一个你。如果你想添加一个新的动物,你必须创建一个新的对象:

private void btnAddAnimal_Click(object sender, RoutedEventArgs e) 
{ 
    Animal animal = new Animal(); 
    animal.AnimalSize = Size.large; 
    animal.Carnivore = true; 
    AddAnimal(animal); 
} 
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); 
} 
相关问题