2016-11-15 1 views
2

관리되는 리소스 만 사용하는 클래스가있는 경우 IDisposable 패턴을 완전히 구현할 필요가 없습니다. 내가 어떤 이유로 사용이 표시되지 않습니다C#에서 가장 단순한 IDisposable 패턴은 무엇입니까?

public class ManagedResourceClient : IDisposable 
    { 
     private ITheManagedResource _myManagedResource = new TheManagedResource() 

     public void Dispose() 
     { 
      if (_myManagedResource != null) 
      { 
       _myManagedResource.Dispose(); 
       _myManagedResource = null; 
      } 
     } 
    } 

:

은 분명히이 충분

  • 이 같은 파이널 라이저는 IDisposable
  • 구현에만 관리되는 리소스를 사용하는을은 '폐기 '플래그는 null 체크로 처리됩니다.
  • GC 처리와 직접 호출을 구분할 필요가 없으므로 가상 처리 메소드입니다.

위의 사항을 올바르게 확인할 수 있습니까?

+1

이 응용 프로그램입니다 멀티 스레드? –

+3

"관리되는 리소스 만 사용하는 클래스가 있습니다."그러면 객체가 다른 관리되는 일회용 객체를 참조하는 예제 코드에서 알 수 있듯이 @Steve는 전혀 처리되지 않습니다. – Steve

+0

세계의 거의 모든 C# 프로그래머를 위해, 이것은 작성해야 할 유일한 IDisposable 클래스 유형입니다. – Servy

답변

4

클래스가 봉인되지 않았기 때문에 누군가가 클래스에서 파생 될 수 있고 파생 클래스가 객체를 처리해야 할 수도 있으므로 거의 사용했을 것입니다. 클래스를 봉인하고 현재 구현이 정상적으로 작동하도록하십시오.

public sealed class ManagedResourceClient : IDisposable 
{ 
    private ITheManagedResource _myManagedResource = new TheManagedResource() 

    public void Dispose() 
    { 
     if (_myManagedResource != null) 
     { 
      _myManagedResource.Dispose(); 
      _myManagedResource = null; 
     } 
    } 
} 

당신이 폐기 (마이크로 소프트가 제공하는 finializer와 주식 예를 실제로 나쁜 예 이유) Stepen 클리 어리하여이 정말 좋은 문서를 참조에 대한 자세한 내용을 원한다면는 "IDisposable: What Your Mother Never Told You About Resource Deallocation는"

+0

감사합니다. 봉인되지 않았다면 무엇을해야합니까? – user183872

+0

@ user183872 가상을 배출하거나 보호 된 Dispose 함수를 만들어 가상으로 만듭니다 (보호 된 함수를 하나의 "표준"처분 패턴으로 만듭니다) –

+0

문서를 읽어야합니다. 클래스가'SafeHandle'에서 파생되지 않으면 클래스에 finializer가 있어야합니다. 하나의 관리되지 않는 객체 (유형 0)와 유형 0 또는 다른 유형 1 객체 (유형 1) 만 보유하는 유형의 두 가지 유형으로 논리를 분리합니다. –

관련 문제