2010-01-04 3 views
0
.... 
.... 
Employee employeeInfo; 
for(int i =0; i<n;++i) 
{ 
    employeeInfo = new Employee(); 
    employeeInfo.FirstName = arr[i].ToString(); 
    employeeInfo.Age = i; 
    employeeList.Add(employeeInfo); 
    .... 
} 
+1

... for for 루프를 제공하십시오. 다음과 같은 것이 있어야합니다 :'listEmployee.Add (employeeInfo);' – JCasso

+0

employeeInfo라는 변수/슬롯/상자가 있습니다. 루프에서 매번 새로운 직원을 얻고 상자에있는 것을 꺼내고 상자에 직원을 넣어 ... – Gishu

+0

jcasso와 동의하겠습니까? .Add() 개체 (즉, 직원의 경우) 목록이나 컬렉션이 있어야합니다. –

답변

4

객체를 할당 => 잃어버린 시간을 사용하지 않는 객체를 생성합니다. 가지고있는 것은 객체에 대한 참조 인 지역 변수이며, 변수는 생성 된 각 객체에 사용됩니다.

로컬 변수를 사용하여 현재 개체를 추적하고 나중에 개체를 컬렉션에 루프 저장할 수 있습니다.

각 개체를 어딘가에 저장하지 않으면 다음 개체를 변수에 할당하면 이전 개체가 손실됩니다. 이전 개체가 여전히 존재하지만 더 이상 참조가 없으므로 나중에 가비지 수집기에서 제거됩니다. 이 LOC를 호출

+0

@ Guffa, 설명을 이해했다면 새로운 직원 개체를 만들 때 스택에 변수가 있고 heap에 개체가있을 것입니다. 프로그램에서 새 직원 개체, 힙의 새 개체를 인스턴스화하는 모든 반복 (주소가 다른) 다른 위치에 생성되지만 스택에 employeeInfo라는 변수가 하나만 있습니다. 속성에 값을 설정 한 후 생성 된 객체를 목록에 추가합니다. 사실 우리는 객체의 주소를 어딘가에 저장합니다. 맞습니까? – odiseh

+0

@Guffa : qquestion : 우리가 알고있는 것처럼 GC 액션의 비 결정적입니다. n = 10, i = 8을 가미하면 지금까지 8 개의 객체를 목록에 추가했거나 8 개의 주소를 저장했습니다. 그 목록. 갑자기 GC가 작업을 시작하면 사용하지 않는 객체가 지워집니다. 그러면 주소가 어떻게됩니까? – odiseh

+0

@odiseh : 가비지 수집기는 도달 할 수없는 객체 만 제거합니다. 객체에 대한 참조를 제거한다고해서 자동으로 객체가 수집되는 것은 아닙니다. 목록에있는 개체에 대한 참조가있는 한 안전합니다. – Guffa

0

은 당신의 코드에 따르면 모든 반복에

당신은 GC를받을 수 있습니다 employeeInfo 참조하는 새 개체 및 기존 개체를 만들 수 있습니다.

+0

또는 Employee 생성자가 정적 컬렉션을 참조해야합니다 ...하지만 실제로는 못 생길 수 있지만 초보자 용 스 니펫은 유용하지 않습니다. – Dykam

0

당신은 쓸모없는 것을하고있는 의미에서 당신은 당신이 다음 만든 employeeInfo와 다른 작업을하지 않으면 - 이름이없는 메모리를

0
employeeInfo = new Employee();//this is where you are "instantiating objects with the same name" in your for loop. 

매번는 employeeInfo 객체의 이전 값은 객체의 초기 상태로 대체됩니다; 즉, 이 호출되면 employeeInfo의 속성/변수가 기본값 (생성자에 의해 제공된 경우)에 의해 대체됩니다.

0

변수를 상자로 표시하십시오. 상자에 새 Employee()를 배치하고 이름을 지정하여 일부 컬렉션에 추가합니다. 그 다음에 루프를 반복 할 때 상자를 넘겨서 (이전 Employee에 대한 참조를 버리지 만 컬렉션에는 여전히 참조가 있으므로 문제가되지 않음) 상자에 새 Employee()를 추가합니다. 상자 안의 내용은 가비지 컬렉터가 청소합니다.

관련 문제