เราควรใช้รูปแบบการออกแบบ 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)); } }