2010-07-05 4 views
2

처분 비교를 사용하지 않는 것이 좋습니다. 첫 번째 구문 분석에서 관리되지 않는 리소스를 제거합니까?. NET FINALIZE CONCEPT 문제

마무리를 억제하는 것은 무엇입니까?

답변

4

는 IDisposable의 구현은 다음과 같아야 객체가 종료자를 갖는

public MyClass : IDisposable 
{ 
    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    protected Dispose(bool disposing) 
    { 
     if(disposing) 
     { 
      // release unmanaged resource 
     } 
     // release managed resources 
    } 

    ~MyClass() 
    { 
     Dispose(false); 
    } 
} 

경우 CLR은 마무리의 대기열에 대한 참조를 유지한다. (Dispose()를 호출하는) 객체를 수동으로 처분하는 경우에는 관리되지 않는 리소스를 이미 제거합니다 (dispose 및 finalizer가 공유됨에 따라). 따라서 finalizer를 호출 할 필요가 없으므로 안전하게 객체를 제거 할 수 있습니다 대기열 (GC.SuppressFinalize (this) 호출).

+0

한숨은 신화가 IDisposable의 일반적인 구현은 쫓아내는 것이 불가능합니다. –

+0

IDisposable을 올바르게 구현하는 방법에 대한 링크를 공유 할 수 있습니까? – munissor

+0

내 대답보기. :) –

0

일반적으로 Dispose 및 Finalize는 관리되지 않는 리소스 (예 : 핸들)를 정리합니다. GC가 개체가 더 이상 사용되지 않는 것을 감지하면 두 가지 중 하나가 발생합니다. 최상의 경우, 객체를 마무리 할 필요가없는 경우 (관리되지 않는 리소스가 있거나 억제 마무리라고하는 사람이있는 경우) 바로 정리됩니다. 최악의 경우 finalizer가 실행되고 객체가 완전히 정리 될 때까지 finalize가 필요한 다른 영역에 배치되고 수명이 길어집니다 (관리되지 않는 리소스에 더 오래 걸림).

마무리가 필요한 많은 개체를 사용하면 성능에 큰 영향을 줄 수 있습니다. Disposing은 두 가지 목적을 수행합니다. 즉, 관리되지 않는 리소스를 돌려 주며 GC를 중단시키는 Finalizer를 억제합니다 (Dispose를 올바르게 구현했다고 가정). 그래도 사람들은 Dispose (또는 Using)를 사용하는 것을 잊어서 finalizer가 반드시 존재해야합니다. 그것에 의지하지 마십시오.

1

블로그 게시물 How to Implement IDisposable and Finalizers: 3 Easy Rules을 작성하여 각각의 사용시기와 사용 방법에 대해 자세히 설명합니다. 나는 또한 약간의 Q를 가지고있다 &으로서 on the subject.

IDisposable (및 해당 FxCop 규칙)을 구현하는 방법에 대한 악명 높은 Microsoft 설명서는 끔찍한 구식입니다. 그들은 정확히 마이크로 소프트가 IDisposable을 .NET 1.0에서 어떻게 구현했는지 설명합니다. v2.0이 나왔을 때 BCL의 거의 모든 클래스는 내 블로그 게시물에 설명 된 것과 유사한 지침을 따르도록 개조되었습니다. 유일한 차이점은 에 기본 클래스로 사용하도록 설계된 클래스의 Dispose(bool)을 보호합니다. . 특히 BCL 클래스는 관리 리소스와 관리되지 않는 리소스를 모두 담당합니다.