2011-05-19 7 views
6

यदि मेरे पास ऐसा कुछ कोड है और दूसरे का उपयोग कथन में एक त्रुटि होती है, तो क्या पहली बार निपटान विधि को कॉल नहीं किया जाएगा?कथन का उपयोग करके नेस्टेड - जिसे कोई डिस्पोजेक्ट नहीं किया जाएगा

using (System.Data.SqlClient.SqlConnection cn = new System.Data.SqlClient.SqlConnection(cnstr)) 
{ 
     cn.Open(); 

     using (SqlTransaction tran = cn.BeginTransaction(IsolationLevel.Serializable)) 
       { 

--EDIT--

इसके अलावा यह बेहतर लिखने का प्रयास करें/अंत में ब्लॉक या कथन का उपयोग है। आंतरिक रूप से संकलक कथन का उपयोग करने के लिए कोशिश/अंत उत्पन्न करेगा लेकिन कोडिंग मानकों के अनुसार कौन सा बेहतर होगा?

+0

यह दोनों को विपरीत क्रम में (यानी, आंतरिक को पहले कहा जाता है) में उनका निपटान करेगा। –

उत्तर

11

नहीं, दोनों को बुलाया जाएगा। सिर्फ इसलिए कि आंतरिक कथन में अपवाद कहा जाता है, इसका मतलब यह नहीं है कि पहले अनदेखा किया जाता है।

एक का उपयोग कर बयान है सिर्फ एक और वाक्य रचना के लिए:

var iDisposableItem = new Item(); 

try 
{ 
    ...... 
} 
finally 
{ 
    iDisposableItem.Dispose(); 
} 
तो अपने उदाहरण में

:

var iDisposableItem = new Item(); 

try 
{ 

    var iDisposableItem2 = new Item(); 

    try 
    { 
     throws exception 
    } 
    finally 
    { 
     iDisposableItem2 .Dispose(); 
    }  

} 
finally 
{ 
    iDisposableItem.Dispose(); 
} 
अब

क्या ध्यान दिया जाना चाहिए और क्या आपको सावधान रहने की के बारे में है जो कुछ भी कारण होता है पहला अपवाद बाहरी उपयोग कथन के साथ समस्याएं पैदा कर सकता है जब यह Dispose() पर कॉल करता है। अपवाद (वास्तव में या तो) को एक दोषपूर्ण स्थिति में फेंक सकता है और निपटान का निपटान करने के परिणामस्वरूप एक और अलग अपवाद हो सकता है जो पहले "मास्क" करता है। , http://msdn.microsoft.com/en-us/library/aa355056.aspx

+0

अपवाद बुलबुले ऊपर और रिलीज श्रृंखला इसके साथ चला जाता है। – iwayneo

+0

उत्कृष्ट लेख। बहुत बहुत धन्यवाद। – Asdfg

2

एक using बयान कुछ भी नहीं है लेकिन भेष में एक try/finally, जब तक प्रक्रिया को जबरन समाप्त होता है अपने वस्तुओं को सही ढंग से निपटारा हो जाएगा: यह WFC में पकड़ लिया जब using बयानों का उपयोग कर रहा है।

दूसरे शब्दों में, यह:

using (Type1 x = new Type1()) 
{ 
    // a 
    using (Type2 y = new Type2()) 
    { 
     // b 
    } 
    // c 
} 

वास्तव में (यह सरल है) इस के समान है:

Type1 x = new Type1(); 
try 
{ 
    // a 
    Type2 y = new Type2(); 
    try 
    { 
     // b 
    } 
    finally 
    { 
     y.Dispose(); 
    } 
    // c 
} 
finally 
{ 
    x.Dispose(); 
} 
0

यह दोनों निपटाने जाएगा, और आप इसे पसंद छोटा कर सकते हैं:

using (SqlConnection cn = new SqlConnection(cnstr), SqlTransaction tran = cn.BeginTransaction(IsolationLevel.Serializable)) 
{ 
    cn.Open(); 

} 
+0

मुझे नहीं लगता कि मैं ऐसा कर सकता हूं क्योंकि दोनों अलग-अलग प्रकार के हैं। – Asdfg

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