हां, Disposeबुलाया जाएगा। जैसे ही निष्पादन को usingब्लॉक का दायरा छोड़ दिया जाता है , भले ही इसका मतलब यह हो कि ब्लॉक छोड़ने के लिए क्या किया गया है, चाहे वह ब्लॉक के निष्पादन का अंत हो, एक returnबयान, या एक अपवाद।
जैसा कि @Noldorin सही ढंग से बताता है, usingकोड में एक ब्लॉक का उपयोग करके try/ में संकलित किया जाता है finally, Disposeजिसे finallyब्लॉक में बुलाया जाता है । उदाहरण के लिए निम्नलिखित कोड:
using(MemoryStream ms = new MemoryStream())
{
//code
return 0;
}
प्रभावी रूप से बन जाता है:
MemoryStream ms = new MemoryStream();
try
{
// code
return 0;
}
finally
{
ms.Dispose();
}
इसलिए, क्योंकि ब्लॉक के निष्पादन को समाप्त finallyकरने के बाद निष्पादित करने की गारंटी दी गई है try, इसके निष्पादन पथ की परवाह किए बिना, Disposeकॉल करने की गारंटी दी जाती है, चाहे जो भी हो।
अधिक जानकारी के लिए, यह MSDN आलेख देखें ।
परिशिष्ट:
जोड़ने के लिए बस थोड़ा सा चेतावनी: क्योंकि Disposeबुलाया जाने की गारंटी है, यह लगभग हमेशा एक अच्छा विचार है यह सुनिश्चित करने के लिए कि आप Disposeकभी भी अपवाद नहीं फेंकते जब आप इसे लागू करते हैं IDisposable। दुर्भाग्य से, वहाँ कोर पुस्तकालय में कुछ वर्गों है कि कर रहे हैं ऐसा कुछ निश्चित परिस्थितियों में फेंक जब Disposeमैं अपने आप को देख रहा हूँ, WCF सेवा संदर्भ / क्लाइंट प्रॉक्सी - कहा जाता है! - और जब ऐसा होता है तो मूल अपवाद को ट्रैक करना बहुत मुश्किल हो सकता है यदि Disposeअपवाद स्टैक के दौरान बुलाया गया था, क्योंकि मूल अपवाद Disposeकॉल द्वारा उत्पन्न नए अपवाद के पक्ष में निगल जाता है । यह भयावह रूप से निराशाजनक हो सकता है। या कि निराशा से पागल हो रहा है? इन दो में से एक। शायद दोनो।