2010-02-17 7 views
17

अगर मैं इस तरह की एक का उपयोग कर ब्लॉक के साथ एक विधि है ...क्या होता है जब 'उपयोग' ब्लॉक के भीतर से 'वापसी' कहा जाता है?

public IEnumerable<Person> GetPersons() 
    { 
     using (var context = new linqAssignmentsDataContext()) 
     { 
      return context.Persons.Where(p => p.LastName.Contans("dahl")); 
     } 
    } 

... कि ब्लॉक का उपयोग के भीतर से मूल्य, IDisposable वस्तु अभी भी निपटारा हो जाता है रिटर्न?

+0

यह भी देखें http://stackoverflow.com/questions/662773/returning-in-the-middle-of-a-using-block और http://stackoverflow.com/questions/1223865/best-practice-regarding -रर्निंग-से-उपयोग-ब्लॉक –

+1

आईएलडीएएसएम या परावर्तक के साथ अपना जेनरेट कोड देखें। –

उत्तर

28

हां यह करता है। ऑब्जेक्ट का निपटान आखिरकार ब्लॉक में होता है जो रिटर्न कॉल के चेहरे पर भी निष्पादित होता है। यह अनिवार्य रूप निम्नलिखित कोड

var context = new linqAssignmentsDataContext(); 
try { 
    return context.Persons.Where(p => p.LastName.Contans("dahl")); 
} finally { 
    if (context != null) { 
    context.Dispose(); 
    } 
} 
6

के लिए बाहर फैलता the MSDN documentation से:

कथन का उपयोग निपटान में कहा जाता है कि एक अपवाद तब होता है, भले ही जब तुम वस्तु पर तरीकों बुला रहे हैं सुनिश्चित करता है। आप ऑब्जेक्ट को एक कोशिश ब्लॉक के अंदर डालकर और अंततः ब्लॉक में निपटान करके उसी परिणाम को प्राप्त कर सकते हैं; वास्तव में, इस प्रकार कथन का अनुवाद कंपाइलर द्वारा किया जाता है।

तो वस्तु हमेशा निपटाई जाती है। जब तक आप पावर केबल प्लग नहीं करते।

+11

"तो ऑब्जेक्ट हमेशा निपटाया जाता है। जब तक आप पावर केबल प्लग नहीं करते।" - इस मामले में, ऑब्जेक्ट को इलेक्ट्रान फैलाने के रूप में निपटाया जाता है ;-) – Nick

+1

मुझे द डेलीडब्ल्यूटीएफ लेख (पहला वाला) याद दिलाता है: http://thedailywtf.com/Articles/My-Tales.aspx –

+1

कॉलिंग पर्यावरण। फ़ेलफ़ास्ट पावर केबल खींचने के अलावा निपटान भी नहीं करें। –

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