जब हमें अप्रबंधित वस्तुओं को निपटाने की आवश्यकता होती है, तो हमें एक आईडीस्पोजेबल डिज़ाइन पैटर्न (या डिस्पोज़ पैटर्न) का उपयोग करना चाहिए।
IDisposable डिज़ाइन पैटर्न को लागू करने के लिए, जो वर्ग अप्रबंधित वस्तुओं से प्रत्यक्ष या अप्रत्यक्ष रूप से संबंधित है, उन्हें IDisposable इंटरफ़ेस लागू करना चाहिए। और IDisposable इंटरफ़ेस के अंदर घोषित विधि को लागू करें। हम अप्रबंधित वस्तुओं के साथ सीधे व्यवहार नहीं करते हैं। लेकिन हम प्रबंधित वर्गों से निपटते हैं, जो सीधे अप्रबंधित वस्तुओं से संबंधित हैं। उदाहरण के लिए, फ़ाइल हैंडलर, कनेक्शन स्ट्रिंग, HTTP स्ट्रीम आदि।
इस पैटर्न का महत्वपूर्ण पहलू यह है कि यह विरासत में मिली कक्षाओं के लिए IDisposable डिज़ाइन पैटर्न का पालन करना आसान बनाता है। और यह एक अत्यधिक निपटान विधि के कार्यान्वयन के कारण है। यह पैटर्न फ़ाइनलाइज़र विधि (या सी # में विनाशक) के उपयोग का भी सुझाव देता है। हालांकि, अगर हम फ़ाइनलाइज़र का उपयोग करते हैं, तो इसके प्रदर्शन प्रभावों के कारण इसे ठीक से प्रबंधित किया जाना चाहिए।
उदाहरण
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)); } }