हां, 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
कॉल द्वारा उत्पन्न नए अपवाद के पक्ष में निगल जाता है । यह भयावह रूप से निराशाजनक हो सकता है। या कि निराशा से पागल हो रहा है? इन दो में से एक। शायद दोनो।