Computer >> 컴퓨터 >  >> 프로그램 작성 >> C#

C#에서 IDisposable 디자인 패턴을 구현하는 방법은 무엇입니까?

<시간/>

관리되지 않는 개체를 처리해야 하는 경우 IDisposable 디자인 패턴(또는 Dispose 패턴)을 사용해야 합니다.

IDisposable 디자인 패턴을 구현하기 위해서는 관리되지 않는 개체를 직간접적으로 처리하는 클래스에서 IDisposable 인터페이스를 구현해야 합니다. 그리고 IDisposable 인터페이스 내부에 선언된 Dispose 메서드를 구현해야 합니다. 우리는 관리되지 않는 개체를 직접 다루지 않습니다. 그러나 우리는 관리되지 않는 개체를 직접 처리하는 관리되는 클래스를 다룹니다. 예를 들어, 파일 핸들러, 연결 문자열, HTTP 스트림 등

이 패턴의 중요한 측면은 상속된 클래스가 IDisposable 디자인 패턴을 따르기 쉽게 만든다는 것입니다. 재정의 가능한 Dispose 메서드의 구현 때문입니다. 이 패턴은 또한 Finalizer 메서드(또는 C#의 소멸자) 사용을 제안합니다. 그러나 Finalizer를 사용하면 성능에 영향을 미치므로 제대로 관리해야 합니다.

static class Program {
   static void Main(string[] args) {
      using var serviceProxy = new ServiceProxy(null);
      serviceProxy.Get();
      serviceProxy.Post("");
      Console.ReadLine();
   }
}
public class ServiceProxy : System.IDisposable {
   private readonly HttpClient httpClient;
   private bool disposed;

   public ServiceProxy(IHttpClientFactory httpClientFactory) {
      httpClient = httpClientFactory.CreateClient();
   }
   ~ServiceProxy() {
      Dispose(false);
   }
   public void Dispose() {
      Dispose(true);
      GC.SuppressFinalize(this);
   }
   protected virtual void Dispose(bool disposing) {
      if (disposed) {
         return;
      }

      if (disposing) {
         // Dispose managed objects
         httpClient.Dispose();
      }
      // Dispose unmanaged objects
      disposed = true;
   }
   public void Get() {
      var response = httpClient.GetAsync("");
   }
   public void Post(string request) {
      var response = httpClient.PostAsync("", new StringContent(request));
   }
}