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

当我们需要处理非托管对象时,应该使用IDisposable设计模式(或“处理模式”)。

为了实现IDisposable设计模式,直接或间接处理非托管对象的类应实现IDisposable接口,并实现IDisposable接口内部声明的Dispose方法。我们不直接处理非托管对象。但是我们处理托管类,它直接处理非托管对象。例如,文件处理程序,连接字符串,HTTP流等。

此模式的重要方面在于,它使继承的类更容易遵循IDisposable设计模式。这是因为实现了可重写的Dispose方法。此模式还建议使用Finalizer方法(或c#中的析构函数)。但是,如果使用终结器,则由于其性能影响而应进行适当管理。

示例

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) {
         //处置托管对象
         httpClient.Dispose();
      }
      //处置非托管对象
      disposed = true;
   }
   public void Get() {
      var response = httpClient.GetAsync("");
   }
   public void Post(string request) {
      var response = httpClient.PostAsync("", new StringContent(request));
   }
}