2016-03-09 7 views
5

के लिए एक रैपर है या नहीं, मुझे कैसे पता चलेगा कि सी # में एक वर्ग अप्रबंधित है, ताकि यदि मैं इसे स्वयं परिभाषित कक्षा में उपयोग करता हूं तो मुझे पता है कि मुझे IDISposable इंटरफ़ेस को कार्यान्वित करना है या नहीं ?मुझे कैसे पता चलेगा कि कोई वर्ग एक अप्रबंधित संसाधन

यदि मुझे एमएसडीएन नेटवर्क पर यह article मिलता है, तो मुझे एक अप्रबंधित संसाधन का उपयोग करते समय हमेशा आईडीस्पोजिबल इंटरफ़ेस को लागू करना होगा।

तो मैं एक छोटे से उदाहरण बना लिया है कि आप नीचे देख सकते हैं:

class TestClass 
{ 
    private StreamReader reader; 

    public UsingTestClass() 
    { 
     reader = File.OpenText("C:\\temp\\test.txt"); 

     string s; 
     while (!string.IsNullOrEmpty(s = reader.ReadLine())) 
     { 
      Console.WriteLine(s); 
     } 

    } 
} 

निम्नलिखित MSDN article कहते हैं, उदाहरण के लिए कि फ़ाइल एक unamanged ressource, जो भी अपने परीक्षण कक्षा में इस्तेमाल किया जाता है। तो मैं कैसे देख सकता हूं कि यह वर्ग असंगत है? कंपाइलर और रीशेपर ने कुछ भी शिकायत नहीं की थी।

अग्रिम धन्यवाद।

+1

सीधे शब्दों में: आप नहीं कर सकते। – ckruczek

+0

तो सिच मामलों में कार्य करने का सबसे अच्छा अभ्यास क्या है? विशेष रूप से आप तीसरे पक्ष के पुस्तकालयों का उपयोग करते हैं? – Fabian

+5

आईडीएसओस्पोजेबल को लागू करने वाली हर चीज का निपटारा किया जाना चाहिए जब आप इसके साथ काम करते हैं। – erikH

उत्तर

6

मैं कैसे पता चलेगा कि सी # में एक वर्ग अप्रबंधित

कि आप तुरंत गलत ट्रैक पर बंद हो जाता है, सी # में सभी कक्षाओं में कामयाब रहे हैं। अप्रबंधित कक्षाओं का उपयोग करने के लिए भाषा का कोई समर्थन नहीं है। .NET भाषाओं में से कोई भी नहीं, एक को छोड़कर: सी ++/सीएलआई। जो एक प्रोग्रामर की मदद करने के लिए विशेष रूप से डिज़ाइन की गई एक अनौपचारिक भाषा है जो देशी सी ++ वर्ग का उपयोग करती है। उस भाषा का उपयोग विशिष्ट है और इस प्रश्न के लिए प्रासंगिक नहीं है।

क्या मायने रखता है कि प्रबंधित वर्ग रैपर एक अप्रबंधित संसाधन के लिए है। एक रैपर एक प्रकार का वर्ग है जिसमें पूरी तरह से प्रबंधित इंटरफ़ेस है लेकिन आंतरिक रूप से एक अप्रबंधित संसाधन का उपयोग करता है, आमतौर पर [DllImport] विशेषता के साथ पिनवोक के माध्यम से। संसाधन लगभग हमेशा IntPtr के साथ दर्शाया जाता है। एक अप्रबंधित हैंडल या सूचक।

इस तरह के एक रैपर को यह सुनिश्चित करने के लिए एक अंतिमकर्ता की आवश्यकता होती है कि अप्रबंधित संसाधन हमेशा जारी किया जाता है। यदि ऐसा नहीं होता है तो आपके पास लीक है, जिस तरह से बग (अंततः) प्रोग्राम को क्रैश करता है जब ऑपरेटिंग सिस्टम बहुत सारे संसाधनों का उपयोग करके किसी प्रोग्राम के बारे में परेशान हो जाता है।

और चूंकि इसमें फाइनलाइज़र है, यह आईडीस्पोज़ेबल भी लागू करता है। जीसी को अंतिम रूप देने के लिए चारों ओर घूमने से पहले, एक कार्यक्रम को अप्रबंधित संसाधनों को जल्दी छोड़ने की अनुमति देना। कथन का उपयोग करके निपटान() विधि या का उपयोग करना वैकल्पिक है, फ़ाइनलाइज़र यह सुनिश्चित करने के लिए पर्याप्त है कि नौकरी पूरी हो जाए।

लेकिन कभी-कभी फ़ाइनलाइज़र पर्याप्त नहीं होता है क्योंकि एक प्रोग्राम कचरा उत्पन्न नहीं करता है और फिर यह बहुत महत्वपूर्ण है कि आप मदद करते हैं। आप वास्तव में नहीं जानते कि आपको सबसे ज्यादा .NET प्रोग्रामर हमेशा मदद करना है या नहीं। और एक सबसेट कभी नहीं करता है और प्रोग्रामिंग के वर्षों में कभी भी कोई समस्या नहीं देखी है। हम अंततः उनसे एसओ :)


स्ट्रीमरडर का आपका उदाहरण अगले चरण में जाने के लिए एक अच्छा है। StreamReader वास्तव में एक अप्रबंधित संसाधन लपेटता नहीं है। इसका सभी कोड सी # में लिखा गया है और इसमें कोई पिनवोक नहीं है, उसके शरीर में एक अप्रबंधित हड्डी नहीं है। और इसलिए में फ़ाइनलाइज़र नहीं है। लेकिन अभी भी एक निपटान() विधि है।

स्ट्रीम रीडर को "संक्रमित" मिला।यह एक रैपर वर्ग भी है, लेकिन स्ट्रीम के लिए, इंटप्राट नहीं। एक पूरी तरह से प्रबंधित अमूर्त .NET प्रकार, स्वयं एक रैपर। जो IDISposable लागू करता है, अब StreamReader में इसे लागू करने के लिए भी है। तो जब आप StreamReader की Dispose() विधि को कॉल करते हैं तो Stream.Dispose() विधि चलाया जा सकता है।

यह काम पर लेयरिंग है, कक्षाओं का एक पदानुक्रम है। StreamReader स्ट्रीम जो FileStream जो SafeFileHandle जो वास्तव में लपेटता IntPtr लपेटता लपेटता गिर्द घूमती है। केवल SafeFileHandle एक फाइनलाइज़र है।


लेयरिंग समझना जहां हर कोई देता है, कि जिस तरह से इन नेट वर्गों संरचित कर रहे में बहुत गहरी अंतर्दृष्टि की आवश्यकता है। आप वहां जा सकते हैं लेकिन इसमें सालों लगते हैं। तीन बुनियादी शॉर्टकट हैं:

  • एक ऑपरेटिंग सिस्टम कैसे काम करता है इसकी समझ है। आपको अंतर्दृष्टि देता है कि एक फ़ाइल एक ऑपरेटिंग सिस्टम संसाधन है, अपनी लूट शर्त लगाओ कि जब आप फ़ाइल का उपयोग करते हैं तो उसे निपटाने या बंद करने की आवश्यकता होती है।

  • वर्ग आप उपयोग के लिए MSDN लाइब्रेरी लेख का प्रयोग करें। जब आप देखते हैं कि इसका निपटान() विधि है तो इसका उपयोग करने के लिए लगभग हमेशा एक अच्छा कारण है। कभी-कभी ऐसा नहीं होता है लेकिन जब भी आप इसे इस्तेमाल करते हैं तो आप कभी भी गलत नहीं होंगे।

  • मुसीबत में जाओ, सभी गलतियों कि हर प्रोग्रामर, बनाने अतः या एक मेमोरी प्रोफाइलर का उपयोग करके पता लगाएं कि आप गलत किया था की जरूरत है सकते हैं। इसे सही तरीके से कैसे करना सीखने में कुछ भी गलत नहीं है।

+0

सारांश देखने के लिए लग रही है: तो अगर हम 'using' या का उपयोग' निपटान() 'हर वर्ग, को लागू करने वाली में' IDisposable' हम हमेशा सुरक्षित हैं? क्या ऐसे मामले हैं, जहां हम 'IDISposable' पर 'निपटान()' को कॉल नहीं करना चाहते हैं? –

+0

मुझे सारांश से नफरत है, सभी शब्दों को समझने की कोशिश करें। अगर मैं कम इस्तेमाल कर सकता था तो मेरे पास होता। "हमेशा सुरक्षित" नहीं, किसी ऑब्जेक्ट का निपटान न करें जो कहीं और उपयोग में है। –

+0

इस विस्तृत उत्तर के लिए बहुत बहुत धन्यवाद। – Fabian

संबंधित मुद्दे