2009-07-10 10 views
6

Dispose pattern के बारे में पढ़ना, मुझे लगता है कि प्रलेखन बार-बार "को प्रबंधित और अप्रबंधित कोड" की सफाई करता है। और Dispose विधि के वैधानिक कार्यान्वयन में, मैं विशिष्ट प्रवाह देखता हूं (disposing पर निर्भर करता है कि वास्तविक या गलत है) प्रबंधित वस्तुओं की सफाई के लिए अप्रबंधित वस्तुओं के विरुद्ध समर्पित है।पैटर्न का निपटान करें: मुझे कैसे पता चलेगा कि क्या प्रबंधित किया गया है और क्या अप्रबंधित है?

लेकिन क्या मैं कमजोर नौसिखिया हूं, यह जानने के लिए कि किस प्रकार के प्रबंधन किए जाते हैं और कौन से अप्रबंधित हैं?

उत्तर

3

संक्षिप्त संस्करण यह है: को लागू करने वाली किसी भी चीज़ को आपके Dispose विधि में कॉल करने की आवश्यकता है। FxCop आपको यह भी बताएगा कि क्या आप कुछ खो रहे हैं (या जब आप होना चाहिए तो IDisposable का उपयोग नहीं कर रहे हैं)।

+0

हालांकि यह वास्तव में प्रश्न का उत्तर नहीं देता है, लेकिन अब मुझे विश्वास नहीं है कि एक अच्छा जवाब मौजूद है। यह तब उत्पन्न होने वाली समस्याओं का सबसे अच्छा व्यावहारिक समाधान प्रदान करता है जब कोई प्रोग्रामर किसी प्रकार की "प्रबंधितता" के बारे में निर्णय नहीं ले सकता है, लेकिन मुझे लगता है कि एक प्रोग्रामर जो निर्णय लेने के लिए एक निश्चित ह्युरिस्टिक चाहता है वह किस्मत से बाहर है। –

0

यदि आप नहीं जानते हैं, तो आप जिन प्रकारों का उपयोग कर रहे हैं वे शायद प्रबंधित हैं।

अप्रबंधित प्रकार उन प्रकारों को संदर्भित करते हैं जो सुरक्षित नहीं हैं, यानी सीएलआर सुरक्षा आवश्यकताओं के अनुरूप नहीं हैं।

Great definition linked:

अद्यतन

मैं downvote समझ में नहीं आता? प्रश्न विशेष रूप से प्रबंधित और अप्रबंधित प्रकारों के बीच अंतर करने के लिए कैसे किया गया था?

अन्य सभी उत्तर प्रबंधित/अप्रबंधित प्रश्न के बजाय IDISpose प्रश्न को संबोधित कर रहे थे !?

अद्यतन 2

फिर भी दूसरे downvote का कोई स्पष्टीकरण नहीं ...

मैं मानता हूँ, एक IDisposable वस्तु हमेशा निपटारा किया जाना चाहिए, लेकिन है कि कामयाब बनाम अप्रबंधित के बारे में सवाल का जवाब नहीं है ।

+0

मेरी दूसरी टिप्पणी के समान, आप कैसे जानते हैं कि एक प्रकार, जैसा कि आप कहते हैं, सीएलआर सुरक्षा आवश्यकताओं के अनुरूप नहीं है? अर्थात।अगर मैं किसी चयनित प्रकार की "अप्रबंधितता" की रिपोर्ट करने के लिए एक प्रतिबिंबक प्लगइन लिखना चाहता था, तो मेरे प्लगइन का एक निश्चित निर्णय लेने के लिए उस प्रकार का निरीक्षण क्या होगा? –

0

मैं बस उनका उपयोग करने के बाद सभी संसाधनों को नष्ट करने का सुझाव देता हूं। कुछ भी जो आमतौर पर सिस्टम संसाधन पर निर्भर करता है जैसे सॉकेट और स्ट्रीम संसाधन जिन्हें आप स्पष्ट रूप से रिलीज़ करना चाहते हैं। जब संदेह में आगे बढ़ें और निपटें। लंबी अवधि में आपको बहुत सारी डिबगिंग परेशानी बचाती है। आम तौर पर जब आप कोड को कॉल करते हैं जो .NET में नहीं लिखा गया है तो आप मान सकते हैं कि यह "प्रबंधित कोड" नहीं है।

2

प्रबंधित या अप्रबंधित वास्तव में कोई फर्क नहीं पड़ता। यदि कोई वर्ग IDISposable इंटरफ़ेस लागू करता है, तो आपको ऑब्जेक्ट के साथ किए जाने पर निपटान() को कॉल करना चाहिए। वैकल्पिक रूप से (अधिमानतः) using statement का उपयोग करने के लिए ऑब्जेक्ट() को स्वचालित रूप से कॉल किया जाता है जब ऑब्जेक्ट स्कोप से बाहर हो जाता है।

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

+0

मुझे लगता है कि सवाल IDISposables डिजाइन करने के परिप्रेक्ष्य से पूछ रहा था - यानी बनाम अंतिम रूप देने का निपटान करते समय क्या मुक्त होना चाहिए और नहीं किया जाना चाहिए। – Rob

+1

@ थोरिनिन - मुझे लगता है कि रॉब बना रहा बिंदु यह है कि यदि आप क्लासिक डिस्प्ले पैटर्न को कार्यान्वित करते हैं, तो आपके पास डिस्पोज़िंग फ्लैग है, यह इंगित करने के लिए कि क्या यह निपटान करने के लिए कॉल करने के कारण है, या फाइनलजर निष्पादन के कारण। बाद के मामले में आपको सावधान रहना होगा कि अन्य प्रबंधित वस्तुओं का निपटान न करें क्योंकि वे पहले ही कचरा एकत्र कर चुके हैं। जब किसी निपटान() विधि से स्पष्ट रूप से बुलाया जाता है तो यह इन्हें निपटाने के लिए सुरक्षित है। * अप्रबंधित * संसाधन, हालांकि, दोनों मामलों में निपटाया जाना चाहिए। –

+0

मैं उस पर गेस्टापो दृष्टिकोण की ओर रुख करता हूं: यदि अंतिमकर्ता को बिल्कुल बुलाया जाता है, तो प्रोग्रामर को जोर से शिकायत करने के लिए शिकायत करें। – Thorarin

5

अप्रबंधित माध्यम मूल Win32 ऑब्जेक्ट्स, मुख्य रूप से हैंडल करता है; और कच्चे COM वस्तुओं के संदर्भ। ये वे संसाधन हैं जो .NET CLR के नियंत्रण में (या प्रबंधित) नहीं हैं।

+0

ठीक है, लेकिन एक सख्ती से-.NET डेवलपर Win32, COM, आदि का उपयोग करने के लिए बहुत छोटा होगा * पता * कि संसाधन सीएलआर के नियंत्रण में नहीं है, या फिर भी बदतर है, * उस संसाधन पर निर्भर करता है * सीएलआर के नियंत्रण में नहीं है? मेरा मतलब है, आप कैसे जानते हैं कि * हैंडल अप्रबंधित है? शायद अनुभव करें। लेकिन उस अनुभव की अनुपस्थिति में, हर बार सही होने के लिए एक हिरण प्रोग्रामर कैसा होता है? मेरा तर्क है कि IDISposable इंटरफ़ेस की उपस्थिति पर्याप्त नहीं है; आपके औसत प्रोग्रामर को IDISposable के उल्लेख के लिए हर प्रकार के दस्तावेज़ों की जांच करने के लिए सिखाया नहीं जाता है। –

+1

मैं विपरीत कहता हूं। यदि आईडीस्पोजेबल है, तो निपटान करें। अवधि। इस तरह, निविदा युवाओं को कभी भी COM के आघात का खुलासा करने की आवश्यकता नहीं होती है। –

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