2013-06-01 2 views
1

Person 유형의 목록이 있습니다. 사람 목록을 만들면 이전 목록 요소의 정보가 현재 목록으로 바뀝니다. 나는 이것이 정적 클래스 변수의 문제라는 것에 대해 읽었지만 내 속성은 정적이 아닙니다.list 이전의 모든 요소를 ​​바꿉니다

class Person{ 
private string _name; 
private string _address; 

public string Name{ 
get{ return _name;} 
set { _name = value;} 

public string Address{ 
get{ return _address;} 
set { _address = value;} 
} 
} 

파일에서 사람들을 읽어 문자열 배열로 저장합니다. 배열이 정확한지 확인하기 위해 단계를 밟았습니다. 그것은. 이 이상한 얻는 경우 여기

은 다음과 같습니다

string[] personArray; 
Person tempPerson = new Person(); 
List<Person> people = new List<Person>(); 
foreach (string line in lines)//lines are the people from file, it is correct 
{ 
personArray = line.Split(','); 
if (personArray.Length == 2) 
{ 
tempPerson.Name = personArray[0]; 
tempPerson.Address = personArray[1]; 
people.Add(tempPerson); 
} 
} 

내가 코드를 단계별로 첫 번째 사람이 두 번째 사람이 을 추가, 제대로 추가 사람들을 조사하고 두 번째 사람의 정보가 있습니다. add 문 다음에 올 때까지 모든 것이 올바르게 보입니다.

답변

5

당신은 그렇지 않으면이 같은 개체의 속성을 변경하는 루프

 string[] personArray; 

     List<Person> people = new List<Person>(); 
     foreach (string line in lines)//lines are the people from file, it is correct 
     { 
      personArray = line.Split(','); 
      if (personArray.Length == 2) 
      { 
      Person tempPerson = new Person(); 
      tempPerson.Name = personArray[0]; 
      tempPerson.Address = personArray[1]; 
      people.Add(tempPerson); 
      } 
     } 

Person tempPerson = new Person(); 

의 초기화를 이동해야합니다.

+0

정말 고마워요. 내가 추가에 문제가 아니라고 생각 했어? 나는 C++에서 이것을 수행하고 잘 동작 하는가? – Lainezor

+1

@Lainezor : 이것이 모든 언어가 같은 방식으로 처리한다고 가정하기보다는 실제로 사용하는 언어에 대해 배우는 것이 중요합니다. .NET에서 참조와 개체의 차이점을 이해하는 것이 중요합니다. http://pobox.com/~skeet/csharp/references.html –

+3

@Lainezor보기 - C++에서'벡터 '을 가지고 있다면'people.push_back (tempPerson)'은'tempPerson' 객체를 벡터에 복사 할 것입니다 . C#에서'people.Add (tempPerson)'은'tempPerson'에 ** 참조 **를리스트에 추가합니다. 이것은 여러분의리스트가 하나의'Person' 객체에 대한 동일한 참조의 여러 사본을 포함한다는 것을 의미합니다. 이 객체를'tempPerson' 참조를 통해 돌연변이시키고 있으므로 모든 목록 요소에 변경 사항이 나타납니다. – Lee

관련 문제