Evet, Disposearanacak. Yürütme, usingbloğ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 returnifade veya bir istisna olabilir.
@Noldorin doğru bir şekilde kullanılarak işaret ettiği gibi, usingkod bloğu içine derlenmiş try/ finallyile Disposede çağrılan finallyblok. Ö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 finallysonra tryyürütülmesi Disposegarantilidir , 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 , Disposeuygularken 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 Disposesana bakıyorum, WCF Servis Referans / İstemci proxy - denir! - ve bu olduğunda, Disposebir 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.