Computer >> Máy Tính >  >> Lập trình >> C#

Làm thế nào để triển khai IDisposable Design Pattern trong C #?

Chúng ta nên sử dụng mẫu thiết kế IDisposable (hoặc Mẫu vứt bỏ) khi chúng ta cần xử lý các đối tượng không được quản lý.

Để triển khai mẫu thiết kế IDisposable, lớp xử lý các đối tượng không được quản lý trực tiếp hoặc gián tiếp sẽ triển khai giao diện IDisposable. Và thực hiện phương thức Dispose được khai báo bên trong giao diện IDisposable. Chúng tôi không trực tiếp giao dịch với các đối tượng không được quản lý. Nhưng chúng tôi xử lý các lớp được quản lý, các lớp này xử lý trực tiếp với các đối tượng không được quản lý. Ví dụ:Trình xử lý tệp, chuỗi kết nối, luồng HTTP, v.v.

Khía cạnh quan trọng của mẫu này là nó giúp các lớp kế thừa tuân theo mẫu thiết kế IDisposable dễ dàng hơn. Và đó là do việc triển khai một phương pháp Dispose có thể ghi đè. Mẫu này cũng gợi ý việc sử dụng phương thức Finalizer (hoặc hàm hủy trong c #). Tuy nhiên, nếu chúng tôi sử dụng Finalizer, thì nó nên được quản lý đúng cách do các tác động về hiệu suất của nó.

Ví dụ

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));
   }
}