Evet, Dispose
aranacak. Yürütme, using
bloğun kapsamını terk eder etmez, bloğu terk etmenin ne anlama geldiğine bakılmaksızın, bloğun yürütülmesinin sonu, bir return
ifade veya bir istisna olabilir.
@Noldorin doğru bir şekilde kullanılarak işaret ettiği gibi, using
kod bloğu içine derlenmiş try
/ finally
ile Dispose
de çağrılan finally
blok. Örneğin aşağıdaki kod:
using(MemoryStream ms = new MemoryStream())
{
//code
return 0;
}
etkili bir şekilde şu hale gelir:
MemoryStream ms = new MemoryStream();
try
{
// code
return 0;
}
finally
{
ms.Dispose();
}
Bu nedenle, bloğun yürütülmesi bittikten finally
sonra try
yürütülmesi Dispose
garantilidir , yürütme yoluna bakılmaksızın, ne olursa olsun çağrılması garanti edilir.
Daha fazla bilgi için bu MSDN makalesine bakın .
Ek:
Eklemek için küçük bir uyarı: Dispose
çağrılması garantili olduğundan , Dispose
uygularken asla bir istisna oluşturmamasını sağlamak neredeyse her zaman iyi bir fikirdir IDisposable
. Ne yazık ki, çekirdek kitaplığında bazı sınıflar vardır yapmak bazı durumlarda atmak Dispose
sana bakıyorum, WCF Servis Referans / İstemci proxy - denir! - ve bu olduğunda, Dispose
bir istisna yığını çözülme sırasında çağrılmışsa , orijinal istisnayı bulmak çok zor olabilir , çünkü orijinal istisna, Dispose
çağrı tarafından oluşturulan yeni istisna lehine yutulur . Çıldırtıcı derecede sinir bozucu olabilir. Yoksa sinir bozucu bir şekilde çıldırtıcı mı? İkinin biri. Belki ikisi de.