सी # 2008
मैं इस पर कुछ समय से काम कर रहा हूं, और मैं अभी भी कोड में अंतिम रूप देने और निपटान के तरीकों के बारे में उलझन में हूं। मेरे सवाल नीचे हैं:
मुझे पता है कि मानव रहित संसाधनों का निपटान करते हुए हमें केवल एक अंतिम रूप देने की आवश्यकता है। हालांकि, यदि प्रबंधित संसाधन हैं जो अप्रबंधित संसाधनों को कॉल करते हैं, तो क्या अभी भी इसे अंतिम रूप देने की आवश्यकता होगी?
हालाँकि, अगर मैं एक ऐसे वर्ग का विकास करता हूँ जो प्रत्यक्ष या अप्रत्यक्ष रूप से किसी भी अप्रबंधित संसाधन का उपयोग नहीं करता है, तो क्या मुझे
IDisposableउस वर्ग के ग्राहकों को 'कथन का उपयोग करने' की अनुमति देने के लिए लागू करना चाहिए ?क्या केवल आपके कथन का उपयोग करने के लिए अपने वर्ग के ग्राहकों को सक्षम करने के लिए आईडीसोपायरी को लागू करना संभव होगा?
using(myClass objClass = new myClass()) { // Do stuff here }मैंने फाइनल / डिस्पोजल उपयोग को प्रदर्शित करने के लिए नीचे यह सरल कोड विकसित किया है:
public class NoGateway : IDisposable { private WebClient wc = null; public NoGateway() { wc = new WebClient(); wc.DownloadStringCompleted += wc_DownloadStringCompleted; } // Start the Async call to find if NoGateway is true or false public void NoGatewayStatus() { // Start the Async's download // Do other work here wc.DownloadStringAsync(new Uri(www.xxxx.xxx)); } private void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { // Do work here } // Dispose of the NoGateway object public void Dispose() { wc.DownloadStringCompleted -= wc_DownloadStringCompleted; wc.Dispose(); GC.SuppressFinalize(this); } }
स्रोत कोड के बारे में प्रश्न:
यहाँ मैंने अंतिम रूप नहीं जोड़ा है, और सामान्य रूप से अंतिम रूप से GC को बुलाया जाएगा, और अंतिम रूप से Dispose को कॉल करेगा। जैसा कि मेरे पास अंतिम रूप नहीं है, मैं निपटान विधि कब कहूं? क्या यह उस वर्ग का ग्राहक है जिसे इसे कॉल करना है?
इसलिए उदाहरण में मेरी कक्षा को NoGateway कहा जाता है और ग्राहक इस तरह वर्ग का उपयोग और निपटान कर सकता है:
using(NoGateway objNoGateway = new NoGateway()) { // Do stuff here }क्या डिस्पोज़ विधि को स्वचालित रूप से बुलाया जाएगा जब निष्पादन ब्लॉक के अंत तक पहुंच जाता है, या क्लाइंट को मैन्युअल रूप से डिस्पोज़ विधि को कॉल करना पड़ता है? अर्थात
NoGateway objNoGateway = new NoGateway(); // Do stuff with object objNoGateway.Dispose(); // finished with itमैं
WebClientअपनीNoGatewayकक्षा में कक्षा का उपयोग कर रहा हूं । क्योंकि इंटरफ़ेस कोWebClientलागू करताIDisposableहै, इसका मतलब यह है किWebClientअप्रत्यक्ष रूप से अप्रबंधित संसाधनों का उपयोग करता है? क्या इसका पालन करने के लिए एक कठिन और तेज़ नियम है? मुझे कैसे पता चलेगा कि एक वर्ग अप्रबंधित संसाधनों का उपयोग करता है?