2011-03-22 2 views
2

난 그냥 몇 가지 방법에 사용되는 변수가 완료 메소드의 실행 후 간 경우, 아래의 코드를 참조하십시오 모르겠어요 :이 변수는 사용 후에 폐기됩니까?

void Foo() 
    { 
     List<object> conditionedObjList; 
     conditionedObjList = GetConditionedObjectList 
      (
      new List<object>() { /*there are many unconditioned objects here*/} 
      ); 
    } 

내 질문; myObjList에 정의 된 GetConditionedObjectListmyObjList이 반환 된 후에 처리되거나 수동으로 처리해야합니까? 당신이에 대한 참조를 반환하는대로

private List<object> GetConditionedObjectList(List<object> originalObjList) 
    { 
     List<object> myObjList = new List<object>(); 
     /*do some selection*/ 
     myObjList.AddRange(new object[]{/*there are 100 conditioned objects here*/}); 
     return myObjList; 
    } 
+3

무엇을 하려는지 명확하지 않습니다. 'GetConditionedObjectList'는 들어오는 매개 변수를 완전히 무시합니다. GetConditionedObjectList에 대한 호출이 반환 될 때, Foo의 지역 변수'conditionedObjList'는 당신이'GetConditionedObjectList'에서 생성 한'myObjList'리스트에 대한 참조가 될 것입니다. (아마도 무관합니다. Foo가 종료되면 더 이상 목록에 대한 참조가 없으며 가비지 수집으로 표시됩니다. –

+1

당신이 쓰레기 수거보다는 .NET에서 다른 의미를 가지고있는 것처럼 들린다. –

+0

Joel에게 : T가 문자열이고, 'GetConditionedObjectList'메서드에서 들어오는 매개 변수 인 originalObjList를 선택한다고 상상해보십시오. , 예. originalObjList의 요소가 "foo"로 시작하는 문자열인지 확인하기 위해 목록을 열거 한 다음 요소를 myObjList에 추가하십시오. myObjList를 반환합니다. – Restart

답변

1

C#에 가비지 수집이 있습니다. 오브젝트는 힙에 작성되며, 오브젝트에 대한 참조가 더 이상 없을 때만 수집됩니다.

myObjList참조을 힙에있는 실제 개체에 저장합니다. 이 참조를 반환하고 변수에 저장하면 GC (가비지 수집기)가 해당 참조를 가져 오지 않도록 보장 할 수 있습니다.

"폐기 됨"으로 "파괴되었습니다"또는 "메모리에서 제거됨"을 의미하는 경우 가비지 수집기가 대신 처리합니다. 객체에 대한 참조를 제거하기 만하면됩니다. 예를 들어, 함수를 호출 한 후 conditionedObjListnull으로 설정할 수 있습니다. 그러면 GC는 참조되지 않은 객체를 자유롭게 선택할 수 있습니다. 이것은 즉각적이지는 않습니다. GC는보다 효율적으로 주기적으로 실행됩니다.

+1

참조를 스택 변수에 저장한다고해서 수집되지 않을 수도 있습니다. http://www.codeneverwritten.com/2007/12/04/where-did-my-object-go-part-1/ –

+1

@Curt : 흠, 흥미 롭습니다. 이 기사의 예제를 사용해 보았지만 .NET 3.5에서 동작을 재현 할 수 없었습니다 (디버그와 릴리스는 일관되게 동작합니다. 메소드 끝나기 전까지는 객체를 수집하지 않습니다. 우연히 그 행동에 빠질 가능성은 희박합니다 ... – Cameron

1

것은 그것은 배치되지 않습니다.

함수를 반환 한 후에도 함수가 로컬에서 함수로만 사용 되었다면 범위를 벗어 났으므로 GC는 자유롭게 해당 값을 수집합니다.

BTW List<T>은 IDisposable을 구현하지 않으므로 코드에 처리 할 필요가 없습니다.

1
  1. 목록에는 IDisposable이 구현되어 있지 않으므로이 목록을 전혀 처리 할 필요가 없습니다.
  2. 참조가 없으면 가비지 수집되도록 표시됩니다.
관련 문제