[C#] .NET에서 사용한 후 개체를 Null / Nothing으로 설정

작업이 끝나면 모든 개체를 null( NothingVB.NET에서) 로 설정해야합니까 ?

.NET에서는 IDisposable일부 자원을 해제 하기 위해 인터페이스를 구현하는 객체 인스턴스를 처분해야한다는 것을 이해합니다. 하지만 객체는 폐기 된 후에도 여전히 무언가 일 수 있으므로 (따라서 isDisposed양식 의 속성) 여전히 상주 할 수 있다고 가정합니다 기억이나 적어도 부분적으로?

또한 객체가 범위를 벗어나면 가비지 수집기의 다음 단계를 위해 수집 준비가 완료된 것으로 표시됩니다 (시간이 걸릴 수 있음).

따라서 이것을 염두에두고 null메모리가 더 이상 범위에 있지 않으며 부작용이 없다는 것을 해결할 필요가 없으므로 메모리를 해제하는 시스템 속도를 높이도록 설정합니다 .

MSDN 기사는 예제 에서이 작업을 수행하지 않으며 현재 해를 볼 수 없으므로이 작업을 수행합니다. 그러나 나는 의견이 혼합되어 의견이 유용합니다.



답변

Karl은 절대적으로 정확합니다. 사용 후 객체를 null로 설정할 필요가 없습니다. 객체가을 구현하는 경우 해당 객체 ( .. 또는 블록에 싸여 있음)를 완료 IDisposable하면 호출해야합니다 . 그러나을 호출하는 것을 기억하지 않아도 객체의 finaliser 메소드가 호출해야 합니다.IDisposable.Dispose()tryfinallyusing()Dispose()Dispose()

나는 이것이 좋은 치료법이라고 생각했다.

IDisposable에 파기

IDisposable 이해

자체 조정 및 불투명하기 때문에 GC 및 관리 전략을 다시 추측하려는 데는 아무런 의미가 없습니다. 닷 넷에 제프리 리히터와 내부 동작에 대한 좋은 토론이 있었다 여기 록스 : 제프리 Windows 메모리 모델에 리히터 와 Richters 예약 C #을 통해 CLR을 20 장 좋은 치료가 있습니다 :


답변

작업을 완료 할 때 개체를 null로 설정하지 않는 또 다른 이유는 실제로 개체를 더 오래 살릴 수 있기 때문입니다.

예 :

void foo()
{
    var someType = new SomeType();
    someType.DoSomething();
    // someType is now eligible for garbage collection         

    // ... rest of method not using 'someType' ...
}

“DoSomething”을 호출 한 후 someType에 의해 참조 된 객체를 GC 할 수 있지만

void foo()
{
    var someType = new SomeType();
    someType.DoSomething();
    // someType is NOT eligible for garbage collection yet
    // because that variable is used at the end of the method         

    // ... rest of method not using 'someType' ...
    someType = null;
}

때로는 메소드가 끝날 때까지 객체를 활성 상태로 유지할 수 있습니다. JIT 보통 NULL로 지정을 얻어 최적화 된 것 같은 코드 인 것을 단부의 두 비트 있도록.


답변

객체를 null하지 않습니다. 당신은 체크 아웃 할 수 http://codebetter.com/blogs/karlseguin/archive/2008/04/27/foundations-of-programming-pt-7-back-to-basics-memory.aspx을 자세한 정보는하지만, 사물을 null로 설정하면 더러운 코드를 제외하고는 아무것도하지 않습니다.


답변

또한:

using(SomeObject object = new SomeObject())
{
  // do stuff with the object
}
// the object will be disposed of


답변

일반적으로 사용 후 객체를 null로 지정할 필요는 없지만 어떤 경우에는 좋은 방법입니다.

객체가 IDisposable을 구현하고 필드에 저장되면 배치 된 객체를 사용하지 않기 위해 null로 만드는 것이 좋습니다. 다음과 같은 종류의 버그는 고통 스러울 수 있습니다.

this.myField.Dispose();
// ... at some later time
this.myField.DoSomething();

필드를 삭제 한 후 필드를 null로 설정하고 필드를 다시 사용하는 줄에서 NullPtrEx를 가져 오는 것이 좋습니다. 그렇지 않으면 DoSomething의 기능에 따라 약간의 버그가 발생할 수 있습니다.


답변

null변수 가 필요하다고 느끼면 코드가 제대로 구성되지 않았을 가능성이 있습니다 .

변수의 범위를 제한하는 방법에는 여러 가지가 있습니다.

Steve Tranby가 언급했듯이

using(SomeObject object = new SomeObject())
{
  // do stuff with the object
}
// the object will be disposed of

마찬가지로 중괄호를 사용하면됩니다.

{
    // Declare the variable and use it
    SomeObject object = new SomeObject()
}
// The variable is no longer available

“제목”없이 중괄호를 사용하면 코드를 실제로 정리하고 더 이해하기 쉽게 만들 수 있습니다.


답변

변수를 널로 설정해야하는 유일한 경우는 변수가 범위를 벗어나지 않고 더 이상 연관된 데이터가 필요하지 않은 경우입니다. 그렇지 않으면 필요가 없습니다.