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