C\#표준 IDispose 모드 코드 상세 설명

3756 단어 C#IDispose 모드
C\#IDispose 인터페이스 구현
.net 의 GC 체 제 는 두 가지 문제 가 있 습 니 다.우선 GC 는 모든 자원 을 방출 할 수 없고 비 위탁 관리 자원 을 방출 할 수 없습니다.그 다음으로 GC 도 실시 간 이 아니 라 모든 GC 에 불확실 성 이 존재 한다.
이 문 제 를 해결 하기 위해 donet 은 분석 함 수 를 제공 했다.

public class TestClass : System.IDisposable
{
  //         Dispose  
  public void Dispose()
  {
    //      Dispose  ,          
    Dispose(true);
    //     Dispose    ,             ,    GC      
    System.GC.SuppressFinalize(this);
  }

  //protected Dispose  ,         。
  //  bool disposing           
  protected void Dispose(bool disposing)
  {
    if (disposing)
    {
      ///TODO:       "    "   ,   xxx.Dispose();
    }
    ///TODO:       "     "   
  }

  // GC       
  ~TestClass()
  {
    Dispose(false);//       
  }
}
만약 에 우리 가 적당 한 시기 에 Dispose 를 호출 하 는 것 을 잊 어 버 리 더 라 도 GC 는 대상 을 방출 할 때 비 위탁 관리 자원 을 정리 해 줄 것 이다.GC 가 맡 은 역할 은 보장 수단 일 뿐 이런 역할 을 해 야 한다.우 리 는 그것 에 지나치게 의존 해 서 는 안 된다.실제로 비교적 큰 모듈 이 종 료 될 때 우 리 는 즉시 GC.collect 를 수 동 으로 호출 하여 쓰레기 수 거 를 해 야 한다.
IDisposable 인터페이스의 클래스 를 구현 하 는 이 유 는.net CLR 은 GC(쓰레기 수 거 기)메커니즘 으로 메모 리 를 관리 하기 때 문 입 니 다.C++언어 처럼 대상 의 석조 함수 가 역할 영역 이 끝 날 때 항상 자동 으로 호출 되 고 프로그램 이 실행 되 는 과정 에서 GC 를 시작 하 는 조건 이 충족 되 지 않 으 면 GC 가 한 번 도 시작 되 지 않 았 을 수도 있 습 니 다.이렇게 하면 하나의 유형 이 중요 한 자원 을 점용 해 야 한다 면 IDisposable 인 터 페 이 스 를 실현 하거나 다른 간편 한 방식 을 사용 해 야 한다.예 를 들 어 Using 을 사용 해 야 한다.
Using(MyClass myObj = new MyClass())
{ ... }
IDisposable 인 터 페 이 스 를 실현 하지 못 한 경우 에는 Dispose 방법 이 없 지만,그들의 Finalize 역시 호출 을 보장 할 수 없습니다.
Using(MyClass myObj = new MyClass())
{ ... }
좋 은 방법 이지 만 MyClass 가 IDisposable 인 터 페 이 스 를 실현 해야만 이렇게 쓸 수 있 습 니 다.
IDispose 모드 는 C++에서 자원 을 정리 하 는 데 많이 사 용 됩 니 다.C\#에서 자원 은 위탁 관리 와 비 위탁 관리 두 가지 로 나 뉘 는데 위탁 관리 자원 은 C\#CLR 이 우리 에 게 청 소 를 도와 주 는 것 입 니 다.이것 은 호출 대상 의 분석 함수 로 완 성 된 대상 방출 작업 입 니 다.위탁 관리 시스템 이 아 닌 우리 스스로 방출 해 야 합 니 다.예 를 들 어 데이터 베이스 연결 대상,이것 은 우리 가 수 동 으로 그것 의 Dispose()방법 을 호출 하여 대상 의 석방 을 실현 해 야 합 니 다.사실은 Dispose()내용 이 도대체 무슨 일 을 했 는 지 잘 모 르 겠 습 니 다.물론 이것 이 대상 을 대상 으로 하 는 것 입 니 다.그것 은 당신 의 관계 가 실현 되 기 를 원 하지 않 는 세부 사항 입 니 다.흐!
우리 개발 자 들 에 게 그것 을 어떻게 사용 하 는 지 알 게 된 후에 그것 이 어떻게 실현 되 는 지 에 관심 이 생 길 것 입 니 다.다음 에 저 는 C\#에서 IDispose 모델 을 실현 하 는 코드 를 보 여 드 리 겠 습 니 다.여러분 들 이 같이 공부 해 보 세 요.사실은 그것 의 사용 장소 도 매우 많 습 니 다.저희 가 수 동 으로 사이트,데이터 베 이 스 를 포장 할 때 모두 사용 할 것 입 니 다.다음은 코드 를 보 겠 습 니 다.

 /// <summary>
  ///   IDisposable,            
  /// </summary>
  public class IDisplosePattern : IDisposable
  {
    public void Dispose()
    {
      this.Dispose(true);////      
      GC.SuppressFinalize(this);//                . //             ,               
    }

    protected virtual void Dispose(bool disposing)
    {
      if (!_isDisposed)//_isDisposed false        dispose
      {
        if (disposing)
        {
          //      
        }
        //       
      }
      _isDisposed = true;
    }

    private bool _isDisposed;

    ~IDisplosePattern()
    {
      this.Dispose(false);//       ,             
    }
  }
위의 코드 를 통 해 알 수 있 듯 이 위탁 관리 시스템(C\#CLR 이 관리 하 는)에 대해 서 는~IDisplose Pattern()방법 을 통 해 직접 방출 되 고~IDisplose Pattern()방법 이 언제 호출 되 는 지 알 수 없습니다.CLR 이 호출 을 도와 주 고 우리 가 수 동 으로 dispose 방법 을 진행 할 때 dispose(true)라 는 리 셋 방법 을 호출 합 니 다.그것 은 우리 가 위탁 관리 와 비 위탁 관리 자원 을 정리 하 는 데 도움 을 줄 것 이다.그림 과 같다.

이상 은 이번 소개 의 모든 지식 포인트 내용 입 니 다.여러분 의 학습 과 우리 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기