Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

วิธีการใช้ IDisposable Design Pattern ใน C #?


เราควรใช้รูปแบบการออกแบบ IDisposable (หรือ Dispose Pattern) เมื่อเราต้องกำจัดวัตถุที่ไม่มีการจัดการ

สำหรับการนำรูปแบบการออกแบบ IDisposable ไปใช้ คลาสที่เกี่ยวข้องกับอ็อบเจ็กต์ที่ไม่มีการจัดการโดยตรงหรือโดยอ้อม ควรใช้อินเทอร์เฟซ IDisposable และใช้เมธอด Dispose ที่ประกาศไว้ภายในอินเทอร์เฟซ IDisposable เราไม่ได้จัดการโดยตรงกับวัตถุที่ไม่มีการจัดการ แต่เราจัดการกับคลาสที่มีการจัดการ ซึ่งเกี่ยวข้องโดยตรงกับอ็อบเจ็กต์ที่ไม่มีการจัดการ ตัวอย่างเช่น ตัวจัดการไฟล์ สตริงการเชื่อมต่อ สตรีม HTTP เป็นต้น

ลักษณะสำคัญของรูปแบบนี้คือทำให้คลาสที่สืบทอดมาทำตามรูปแบบการออกแบบ IDisposable ได้ง่ายขึ้น และเป็นเพราะการใช้วิธีการกำจัดที่ลบล้างได้ รูปแบบนี้ยังแนะนำการใช้เมธอด 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));
   }
}