2015-05-07 4 views
-1

Я хотел бы добавить (в цикл) экземпляры класса в список, но на каждой итерации я хочу только обновить одно поле класса. Вот мой Illustation пример:Только список частичного обновления пользовательского класса

 public class info 
    { 
     public string aninmalorhuman; 
     public string type; 
    } 

     var temp = new info(); 
     var infolist = new List<info>(); 
     temp.aninmalorhuman = "animal"; 
     temp.type = "dog"; 
     infolist.Add(temp); 
     temp.type = "cat"; 
     infolist.Add(temp); 

Если я отдам в информационный список консоли он печатает «животное кошка» & «животное кошка». Я думаю, сначала для моего изучения, почему ??? и во-вторых, как мне это сделать, напечатайте «собаку животных» & «животная кошка», пожалуйста?

UPDATE

Я вижу, как это был не самый умный вопрос, но я имел начинающих путаницу, поэтому я не понимаю, почему это отвергнуто. В любом случае, спасибо тем, кто ответил на это.

+1

Вы перезаписывание тот же экземпляр. –

ответ

2

Это потому, что класс является ссылочным типом. Таким образом, в основном вы изменяете один кусок памяти в куче. Good explanation of stack/heap Другими словами, в вашем коде у вас есть 1 указатель на стек, который указывает на одну и ту же часть памяти. (в начале у вас есть «собака» на куче, а затем вы заменяете «собаку» на «кошку»).

Если вы хотите вставить новый объект, то вам необходимо создать новый isntance из «Info класса»

Примера:

  var temp = new info(); 
      var infolist = new List<info>(); 
      temp.aninmalorhuman = "animal"; 
      temp.type = "dog"; 
      infolist.Add(temp); 
      temp = new info(); 
      temp.aninmalorhuman = "animal"; 
      temp.type = "cat"; 
      infolist.Add(temp); 
1

Вы добавляете два раза один и тот же объект (такую ​​же ссылку на объект) ,

Когда вы меняете значение свойства 'type', вы также меняете тот, который содержится в списке.

1

Вы работаете с одним и тем же объектом все время. Создайте новый объект и добавить его в свой список

List<info> infolist = new List<info>(); 

info dog = new info(); //info object for the dog 
dog.aninmalorhuman = "animal"; 
dog.type = "dog"; 
infolist.Add(dog); 

info cat = new info(); //info object for the cat 
cat.aninmalorhuman = "animal"; 
cat.type = "cat"; 
infolist.Add(cat); 
0

Изменения class в struct:

public struct info 
{ 
    public string aninmalorhuman; 
    public string type; 
} 

Если вы хотите использовать классы, реализовать ICloneable интерфейс:

public class info : ICloneable 
{ 
    public string aninmalorhuman; 
    public string type; 

    public info Clone() 
    { 
     return new info() 
     { 
      aninmalorhuman = this.aninmalorhuman, 
      type = this.type, 
     }; 
    } 

    object ICloneable.Clone() 
    { 
     return Clone(); 
    } 
} 

var temp = new info(); 
var infolist = new List<info>(); 
temp.aninmalorhuman = "animal"; 
temp.type = "dog"; 
infolist.Add(temp); 
temp = temp.Clone(); 
temp.type = "cat"; 
infolist.Add(temp); 
Смежные вопросы