2010-06-25 22 views
17

मैं FtpWebResponse कक्षा का उपयोग कर रहा था और एक निपटान विधि नहीं देखी थी। It turns out उस वर्ग को लागू करता है IDisposable, लेकिन इतना है कि आप पहले निपटान कॉल करने से पहले IDisposable करने के लिए अपने उदाहरण कास्ट करना होगा तो स्पष्ट रूप से करता है:एक वर्ग स्पष्ट रूप से स्पष्ट रूप से आईडीस्पोज़ेबल को लागू क्यों करेगा?

// response is an instance of FtpWebResposne 
((IDisposable) response).Dispose(); 

क्यों इसी प्रकार के एक वर्ग के डिजाइनर IDisposable स्पष्ट रूप से लागू करने के लिए किसे चुनेंगे? Anthony Pegram says के रूप में, इस तरह से काम करने से इस तथ्य को मुखौटा किया जाता है कि ऑब्जेक्ट को औसत डेवलपर के लिए निपटाया जाना चाहिए जो हर बार जब वह कक्षा का उपयोग करता है तो प्रलेखन से परामर्श नहीं कर रहा है।

उत्तर

14

यह आमतौर पर किया जाता है यदि कक्षा में Close विधि है जो Dispose के समान है। मूल Dispose एक स्पष्ट कार्यान्वयन में छिपा हुआ है ताकि सटीक उसी विधि में दो नाम न हों।

यह आधिकारिक तौर पर यहाँ अनुशंसा की जाती है:

Do implement a Close method for cleanup purposes if such terminology is standard, for example as with a file or socket. When doing so, it is recommended that you make the Close implementation identical to Dispose...

Consider implementing interface members explicitly to hide a member and add an equivalent member with a better name.

Occasionally a domain-specific name is more appropriate than Dispose. For example, a file encapsulation might want to use the method name Close. In this case, implement Dispose privately and create a public Close method that calls Dispose.

(पी एस मैं इस सम्मेलन से असहमत हैं।)

+0

मैं सहमत हूं, लेकिन यहां अजीब हिस्सा यह है कि व्यवहार संभावित रूप से अलग है। परावर्तक दिखाता है कि निपटान() कॉल बंद करें() और फिर एक आंतरिक आभासी नाम OnDispose() को कॉल करता है। बंद करें() नहीं है, इसलिए आप संभावित रूप से 2 विधियों से अलग व्यवहार प्राप्त कर सकते हैं (हालांकि इसका FtpWebResponse पर कोई प्रभाव नहीं पड़ता है क्योंकि ऑनडिस्पेस() कार्यान्वयन खाली है) – JMarsch

+1

समान नाम वाले दो तरीकों से क्या गलत है? सी # के माध्यम से सीएलआर (पी।546) कहता है कि "कुछ वर्ग जो निपटान पैटर्न प्रदान करते हैं, सुविधा के लिए एक बंद विधि भी प्रदान करते हैं, लेकिन निपटान पैटर्न को इस विधि की आवश्यकता नहीं होती है। उदाहरण के लिए, System.IO.FileStream क्लास निपटान पैटर्न प्रदान करता है, और यह कक्षा भी एक बंद विधि प्रदान करता है। प्रोग्रामर को फ़ाइल को निपटाने के बजाय फ़ाइल को बंद करने के लिए और अधिक प्राकृतिक लगता है। " – MCS

+1

@JMarsch: यह एक होल्डओवर हो सकता है; .NET 1.1 बीसीएल कक्षाओं में कई मामले थे जहां 'बंद करें' और 'निपटान' का थोड़ा अलग व्यवहार था। AFAIK, इन सभी को अब 'डीबीकनेक्शन' और व्युत्पन्न प्रकारों को छोड़कर साफ़ कर दिया गया है। –

1

यह मेरे लिए भी देख एक छोटे से अजीब है। इसके लायक होने के लिए: बेस क्लास (वेब ​​रेस्पॉन्स) एक बंद() विधि लागू करता है। परावर्तक दिखाता है कि WebResponse की Dispose() विधि केवल बंद() और एक आंतरिक ऑनडिस्पेस आभासी कॉल करता है जो कुछ भी नहीं करता है।

मुझे यह स्वीकार करना है कि यह मेरे लिए थोड़ा गंध करता है, लेकिन मुझे लगता है कि उन्होंने स्पष्ट रूप से आईडीस्पोज़ेबल लागू किया ताकि बंद() या निपटान() को कॉल करने के बीच इंटेलिसेंस में भ्रम न हो।

1

क्या कहा गया है के अलावा, मैं सुझाव देना चाहेंगे कि लागू करने IDisposable स्पष्ट using ब्लॉक का उपयोग, (ज्यादातर लोगों के लिए, वैसे भी) लिखने के लिए प्रोत्साहित करती है के रूप में यह किसी भी प्रकार जो IDisposable लागू करता है पर इस्तेमाल किया जा सकता है और यह और अधिक प्राकृतिक है इस:

using (var response = GetResponse()) 
{ 
    // do something 
} 

इस से:

var response = GetResponse(); 

// do something 

((IDisposable)response).Dispose(); 

मुझे यकीन है कि स्पष्ट रूप से IDisposable को लागू करने में एक डेवलपर की मंशा होगा नहीं कर रहा हूँ, लेकिन यह संभव है।

+3

यह उपयोग को प्रोत्साहित करता है, लेकिन * केवल * यदि आप जानते हैं कि ऑब्जेक्ट डिस्पोजेबल है! समस्या यह है कि लोग * दस्तावेज * परामर्श से परामर्श नहीं करेंगे। और कोड पुस्तकालयों के बारे में सोचें जिनमें खराब दस्तावेज हो सकता है (या बिल्कुल भी नहीं)। –

5
  • कभी-कभी एक वर्ग में एक निपटान विधि होगी जो इंटरफ़ेस का हिस्सा है लेकिन वास्तव में इसे कॉल करने की आवश्यकता नहीं है क्योंकि निपटने का एकमात्र संसाधन स्मृति है: उदाहरण के लिए मेमोरीस्ट्रीम।
  • जैसा कि दूसरों द्वारा उल्लिखित किया गया है, यदि कक्षा में एक बंद विधि है जो निपटान की तरह ही होती है, तर्कसंगत रूप से निपटान केवल "उपयोग" पैटर्न का समर्थन करने के लिए मौजूद होना आवश्यक है, इसलिए यह स्पष्ट भी हो सकता है।
संबंधित मुद्दे