मैं FtpWebResponse कक्षा का उपयोग कर रहा था और एक निपटान विधि नहीं देखी थी। It turns out उस वर्ग को लागू करता है IDisposable, लेकिन इतना है कि आप पहले निपटान कॉल करने से पहले IDisposable करने के लिए अपने उदाहरण कास्ट करना होगा तो स्पष्ट रूप से करता है:एक वर्ग स्पष्ट रूप से स्पष्ट रूप से आईडीस्पोज़ेबल को लागू क्यों करेगा?
// response is an instance of FtpWebResposne
((IDisposable) response).Dispose();
क्यों इसी प्रकार के एक वर्ग के डिजाइनर IDisposable स्पष्ट रूप से लागू करने के लिए किसे चुनेंगे? Anthony Pegram says के रूप में, इस तरह से काम करने से इस तथ्य को मुखौटा किया जाता है कि ऑब्जेक्ट को औसत डेवलपर के लिए निपटाया जाना चाहिए जो हर बार जब वह कक्षा का उपयोग करता है तो प्रलेखन से परामर्श नहीं कर रहा है।
मैं सहमत हूं, लेकिन यहां अजीब हिस्सा यह है कि व्यवहार संभावित रूप से अलग है। परावर्तक दिखाता है कि निपटान() कॉल बंद करें() और फिर एक आंतरिक आभासी नाम OnDispose() को कॉल करता है। बंद करें() नहीं है, इसलिए आप संभावित रूप से 2 विधियों से अलग व्यवहार प्राप्त कर सकते हैं (हालांकि इसका FtpWebResponse पर कोई प्रभाव नहीं पड़ता है क्योंकि ऑनडिस्पेस() कार्यान्वयन खाली है) – JMarsch
समान नाम वाले दो तरीकों से क्या गलत है? सी # के माध्यम से सीएलआर (पी।546) कहता है कि "कुछ वर्ग जो निपटान पैटर्न प्रदान करते हैं, सुविधा के लिए एक बंद विधि भी प्रदान करते हैं, लेकिन निपटान पैटर्न को इस विधि की आवश्यकता नहीं होती है। उदाहरण के लिए, System.IO.FileStream क्लास निपटान पैटर्न प्रदान करता है, और यह कक्षा भी एक बंद विधि प्रदान करता है। प्रोग्रामर को फ़ाइल को निपटाने के बजाय फ़ाइल को बंद करने के लिए और अधिक प्राकृतिक लगता है। " – MCS
@JMarsch: यह एक होल्डओवर हो सकता है; .NET 1.1 बीसीएल कक्षाओं में कई मामले थे जहां 'बंद करें' और 'निपटान' का थोड़ा अलग व्यवहार था। AFAIK, इन सभी को अब 'डीबीकनेक्शन' और व्युत्पन्न प्रकारों को छोड़कर साफ़ कर दिया गया है। –