2011-11-23 32 views
13

संभव डुप्लिकेट:
Does Dispose method still get called when Exception is thrown inside of Using statment?संसाधनों का निपटारा किया जाता है भले ही एक उपयोग ब्लॉक में एक अपवाद फेंक दिया गया हो?

जब एक डाटाबेस को ऐक्सेस मैं using ब्लॉक, के एक नंबर मिल गया है। मैं सोच रहा था - अगर उपयोग ब्लॉक के भीतर एक अपवाद फेंकना पड़ा, तो क्या आवश्यक संसाधन अभी भी निपटान किए जाएंगे, भले ही ब्लॉक का अंत तक नहीं पहुंचा जा सके? या मुझे catch ब्लॉक में मैन्युअल रूप से बंद करने की आवश्यकता होगी?

उत्तर

26

using कथन के साथ परिभाषित संसाधनों का निपटारा किया गया था, यह मुख्य कारण है कि using अच्छा है।

कथन का उपयोग कि निपटान कहा जाता है एक अपवाद होता है, भले ही जब तुम वस्तु पर तरीकों बुला रहे हैं सुनिश्चित करता है। आप ऑब्जेक्ट को एक कोशिश ब्लॉक और के अंदर डालकर उसी परिणाम को प्राप्त कर सकते हैं और अंततः ब्लॉक में निपटान को कॉल कर सकते हैं; वास्तव में, इस प्रकार कथन का उपयोग करके का उपयोग संकलक द्वारा किया जाता है।
http://msdn.microsoft.com/en-us/library/yh598w02%28v=VS.100%29.aspx

+1

+1 और 15 सेकंड होने के लिए +1। मुझसे तेज़ ;-) – Fischermaen

+0

धन्यवाद! टाइमर को जवाब स्वीकार करने की प्रतीक्षा कर रहा है :) –

+0

और इस बीच मुझे -1 मिल गया ... – Fischermaen

1

हाँ, ब्लॉक का उपयोग करने का संसाधन निपटारा किया जाएगा।

1

आप नहीं करेंगे। दरअसल using ब्लॉक समान है यदि आप try{}catch{}finally{} अंततः ब्लॉक में निपटान विधि कॉल के साथ निर्माण का उपयोग करते हैं। तो इसे वैसे भी बुलाया जाएगा।

1

हां, तत्व का निपटारा किया जाएगा, क्योंकि try का ब्लॉक है जिसमें using अनुवाद करता है।

सी # विनिर्देश के 8.13 से:

एक बयान का उपयोग कर तीन भागों में अनुवाद किया है: अधिग्रहण, उपयोग, और निपटान। संसाधन का उपयोग कथन में निहित रूप से संलग्न है जिसमें अंत में खंड शामिल है। अंततः खंड संसाधन के का निपटान करता है। यदि एक शून्य संसाधन प्राप्त किया जाता है, तो पर कोई कॉल नहीं किया गया है, और कोई अपवाद नहीं फेंक दिया गया है।

तो आपको इसे मैन्युअल रूप से निपटाने की आवश्यकता नहीं होगी, और मुझे इस बात का अनिश्चितता है कि इस मामले में आपका खुद का catch ब्लॉक होगा। विवरण के लिंक के लिए

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