如何在 C# 中实现 IDisposable 设计模式?


在我们处理非托管对象时我们需要使用一个 IDisposable 设计模式(或处置模式)。

为了实现 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));
   }
}

更新日期: 25-Nov-2020

2K+ 浏览

启动您的职业

完成课程,获得认证

开始
广告
© . All rights reserved.