Tak, Disposezostanie wezwany. Jest wywoływana, gdy tylko wykonanie opuści zakres usingbloku, niezależnie od tego, jakie środki zajęło opuszczenie bloku, czy to koniec wykonywania bloku, returninstrukcja czy wyjątek.
Jak słusznie zauważa @Noldorin, użycie usingbloku w kodzie zostaje wkompilowane do try/ finally, z Disposewywołaniem w finallybloku. 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ż finallyjest gwarantowane wykonanie po tryzakończeniu wykonywania bloku, niezależnie od jego ścieżki wykonania, Disposegwarantuje 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ż Disposegwarantowane jest wywołanie, prawie zawsze dobrym pomysłem jest upewnienie się, że Disposenigdy nie zgłasza wyjątku podczas implementacji IDisposable. Niestety, w podstawowej bibliotece znajdują się klasy, które w pewnych okolicznościach Disposesą 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 Disposezostał wywołany podczas rozwijania stosu wyjątków, ponieważ oryginalny wyjątek zostaje połknięty na rzecz nowego wyjątku wygenerowanego przez Disposewywołanie. To może być irytujące. A może to frustrujące i denerwujące? Jeden z dwóch. Może obydwa.