2010-02-17 4 views
9

यह एक प्रश्न है जिसे मैंने अतीत में कई बार मुझसे पूछा है क्योंकि मैंने 5 गहराई से बयान का उपयोग किया है।क्या सभी डिस्पोजेबल ऑब्जेक्ट्स डिस्प्ले किए गए ब्लॉक के भीतर तत्काल हैं?

docs पढ़ना और कोई जिक्र नहीं अन्य disposables ब्लॉक मैंने तय कर लिया, इसलिए ऐसे संग्रह के लिए एक अच्छा क्यू था भीतर instantiated के बारे में किसी भी तरह की खोज।

इस पर विचार करें:

using (var conn = new SqlConnection()) 
{ 
    var conn2 = new SqlConnection(); 
} 

// is conn2 disposed? 

उत्तर

6

जाहिर है मैं इस सवाल का जवाब है ... ;-)

जवाब नहीं है। उपयोग घोषणाओं में केवल वस्तुओं को

[Test] 
public void TestUsing() 
{ 
    bool innerDisposed = false; 
    using (var conn = new SqlConnection()) 
    { 
     var conn2 = new SqlConnection(); 
     conn2.Disposed += (sender, e) => { innerDisposed = true; }; 
    } 

    Assert.False(innerDisposed); // not disposed 
} 

[Test] 
public void TestUsing2() 
{ 
    bool innerDisposed = false; 
    using (SqlConnection conn = new SqlConnection(), conn2 = new SqlConnection()) 
    { 
     conn2.Disposed += (sender, e) => { innerDisposed = true; }; 
    } 
    Assert.True(innerDisposed); // disposed, of course 
} 
+0

एफवाईआई: प्रश्न सबमिट करने से पहले मुझे क्लिपबोर्ड में जवाब था। –

+0

मुझे लगता है कि यह तकनीकी रूप से संभव है के लिए कि धागा किसी भी तरह इस तरह के निलंबित करने के लिए कि 'SqlConnection.Dispose()' 'conn2' चर गुंजाइश और अपने' Assert' लाइन से बाहर जाने के बीच 'Component.Finalizer() से बुलाया जायेगा' । यहां दौड़ की स्थिति है, है ना? – binki

0

नंबर आईएलडीएएसएम या परावर्तक के साथ जेनरेटेड आईएल की जांच करें।

+0

आप मेरे लिए क्यूएनए के लिए बहुत तेज़ हैं .... –

14

नहीं वे नहीं हैं। केवल उपयोग खंड में स्पष्ट रूप से सूचीबद्ध चर का सेट स्वचालित रूप से निपटाया जाएगा।

+1

तो आपको अपने 6 गहरे का उपयोग करने की आवश्यकता होगी :-) –

+1

मुझे लगता है कि आपके पास एक प्रशंसक क्लब जेरेड है .. lol .. –

0

केवल using() भीतर चर निपटारा किया जाएगा, न कि वास्तविक कोड ब्लॉक। ।

1

सं कारणों कथन का उपयोग में वस्तु निपटारा करने के लिए उपयोग करना। आप अपने वस्तुओं के दोनों निपटारा करने के लिए चाहते हैं, आप को फिर से लिखने चाहिए इस रूप में:

using (var conn = new SqlConnection()) 
{ 
    using (var conn2 = new SqlConnection()) 
    { 
     // use both connections here... 
    } 
} 

या, वैकल्पिक रूप से, आप और अधिक संक्षिप्त वाक्य विन्यास का उपयोग कर सकते हैं:

using (SqlConnection conn = new SqlConnection(), conn2 = new SqlConnection()) 
{ 
    // use both connections here... 
} 
+4

ध्यान दें कि आप लिख सकते हैं यह अधिक कॉम्पैक्टली। "का उपयोग (SqlConn conn1 = नए SqlConn(), conn2 = नए SqlConn()) {सामान}" –

+0

इसके अलावा, एक 'using' बजाय बयान एक ब्लॉक (' का उपयोग कर (वर Conn = नए SqlConnection()) का उपयोग कर (वर conn2 = नया SqlConnection()) {...} ') विजुअल स्टूडियो में अच्छी तरह से रेखांकित किया जाएगा। यह दूसरा 'उपयोग' इंडेंट नहीं करेगा। –

+0

@Eric Lippert: मैंने यह विकल्प भी दिखाने के लिए अपडेट किया है ... @ जेफरी: मैं ऐसा नहीं करता, क्योंकि स्टाइलकॉप शिकायत करता है कि यदि आप प्रत्येक कथन के लिए ब्रेसिज़ का उपयोग नहीं करते हैं। –

4

आप के लिए सटीक नियम चाहते हैं उपयोग कथन विनिर्देश के खंड 8.13 देखें। आपके सभी प्रश्नों का स्पष्ट रूप से उत्तर दिया जाना चाहिए।

+0

@eric, संदर्भ के लिए धन्यवाद। मैंने इस प्रश्न को मेरे उत्तर में परीक्षणों के साथ किसी और चीज की तुलना में सार्वजनिक सेवा के रूप में और अधिक समझने के बाद पोस्ट किया। –

+2

@Eric: उन लोगों के लिए जो एमएसडीएन के रास्ते को नहीं जानते हैं, के लिए एक लिंक की आपूर्ति करने की देखभाल? –

+0

http://www.bing.com/search?q=c%23+ विनिर्देशन –

2

नहीं, यह काम नहीं करता है, conn2 निपटारा नहीं किया जाएगा। ध्यान दें कि गुणकों using केवल उसी परिस्थिति मैं और अधिक lisibility के लिए कोष्ठक का उपयोग नहीं करने की अनुमति देते हैं:

 using (var pen = new Pen(color, 1)) 
     using (var brush = new SolidBrush(color)) 
     using (var fontM60 = new Font("Arial", 15F, FontStyle.Bold, GraphicsUnit.Pixel)) 
     using (var fontM30 = new Font("Arial", 12F, FontStyle.Bold, GraphicsUnit.Pixel)) 
     using (var fontM15 = new Font("Arial", 12F, FontStyle.Regular, GraphicsUnit.Pixel)) 
     using (var fontM05 = new Font("Arial", 10F, FontStyle.Regular, GraphicsUnit.Pixel)) 
     using (var fontM01 = new Font("Arial", 8F, FontStyle.Regular, GraphicsUnit.Pixel)) 
     using (var stringFormat = new StringFormat()) 
     { 
     } 

इस तरह, using नेस्ट एक बड़ी बात नहीं कर रहे हैं।

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