Tak, Dispose
zostanie wezwany. Jest wywoływana, gdy tylko wykonanie opuści zakres using
bloku, niezależnie od tego, jakie środki zajęło opuszczenie bloku, czy to koniec wykonywania bloku, return
instrukcja czy wyjątek.
Jak słusznie zauważa @Noldorin, użycie using
bloku w kodzie zostaje wkompilowane do try
/ finally
, z Dispose
wywołaniem w finally
bloku. Na przykład następujący kod:
using(MemoryStream ms = new MemoryStream())
{
//code
return 0;
}
skutecznie staje się:
MemoryStream ms = new MemoryStream();
try
{
// code
return 0;
}
finally
{
ms.Dispose();
}
Tak więc, ponieważ finally
jest gwarantowane wykonanie po try
zakończeniu wykonywania bloku, niezależnie od jego ścieżki wykonania, Dispose
gwarantuje się wywołanie, bez względu na wszystko.
Aby uzyskać więcej informacji, zobacz ten artykuł MSDN .
Dodatek:
tylko małe zastrzeżenie do dodania: ponieważ Dispose
gwarantowane jest wywołanie, prawie zawsze dobrym pomysłem jest upewnienie się, że Dispose
nigdy nie zgłasza wyjątku podczas implementacji IDisposable
. Niestety, w podstawowej bibliotece znajdują się klasy, które w pewnych okolicznościach Dispose
są wywoływane - patrzę na Ciebie, odwołanie do usługi WCF / serwer proxy! - a kiedy tak się stanie, może być bardzo trudno wyśledzić oryginalny wyjątek, jeśli Dispose
został wywołany podczas rozwijania stosu wyjątków, ponieważ oryginalny wyjątek zostaje połknięty na rzecz nowego wyjątku wygenerowanego przez Dispose
wywołanie. To może być irytujące. A może to frustrujące i denerwujące? Jeden z dwóch. Może obydwa.