2010-10-03 10 views
6

यदि मैं "उपयोग" निर्माण का उपयोग करता हूं, तो मुझे पता है कि ऑब्जेक्ट स्वचालित रूप से निपटाया जाता है। क्या होता है यदि "उपयोग" निर्माण के अंदर एक बयान एक अपवाद उठाता है। क्या "उपयोग" ऑब्जेक्ट अभी भी निपटाया गया है? अगर ऐसा हैं तोह कब?"उपयोग" निर्माण के बारे में मूल

उत्तर

11

एक using ब्लॉक बदल जाती है - संकलक द्वारा - यह करने के लिए:

DisposableType yourObj = new DisposableType(); 
try 
{ 
    //contents of using block 
} 
finally 
{ 
    ((IDisposable)yourObj).Dispose(); 
} 

finally ब्लॉक में Dispose() कॉल डाल करके, यह सुनिश्चित करता है Disposeहमेशा है कहा जाता है - जब तक कि बेशक अपवाद पर होता है तत्काल साइट, क्योंकि यह try के बाहर होती है।

यह याद रखना महत्वपूर्ण है कि using एक विशेष प्रकार का ऑपरेटर या निर्माण नहीं है - यह कुछ ऐसा है जो संकलक कुछ और चीज़ों के साथ बदलता है जो थोड़ी अधिक उलझन में है।

+0

यह भी ध्यान दें कि, के रूप में अपने उदाहरण दिखाता है, यदि DisposableType() करने के लिए कॉल एक अपवाद फेंकता है, निपटान() कहा जाता है नहीं दिखाया जाएगा के बराबर है; अपवाद से पहले आवंटित किसी भी संसाधन को जारी नहीं किया जाएगा। – Ben

+0

@ बेन बहुत सच है। मैं स्पष्ट रूप से इसे इंगित करूंगा। –

+0

'अंत में' ब्लॉक में भी 'शून्य' परीक्षण है। – Ani

2

This article explains it nicely.

आंतरिक रूप से, यह बुरा लड़का एक कोशिश/अंत में वस्तु के आसपास आवंटित किया जा रहा उत्पन्न करता है और निपटान() आप के लिए कहता है। यह आपको मैन्युअल रूप से कोशिश/आखिरकार ब्लॉक बनाने और निपटान() को कॉल करने की परेशानी बचाता है।

2

असल में ब्लॉक का उपयोग करने का प्रयास करने के लिए समतुल्य है - अंततः ब्लॉक, जो सुनिश्चित करता है कि आखिर में हमेशा निष्पादित होगा उदा।

using (SqlConnection con = new SqlConnection(ConnectionString)) 
{ 
    using (SqlCommand cmd = new SqlCommand("Command", con)) 
    { 
     con.Open(); 
     cmd.ExecuteNonQuery(); 
    } 
} 

SqlConnection con = null; 
SqlCommand cmd = null; 

try 
{ 
    con = new SqlConnection(ConnectionString); 
    cmd = new SqlCommand("Command", con); 
    con.Open(); 
    cmd.ExecuteNonQuery(); 
} 
finally 
{ 
    if (null != cmd); 
     cmd.Dispose(); 
    if (null != con) 
     con.Dispose(); 
} 
संबंधित मुद्दे