Ya, Dispose
akan dipanggil. Ini dipanggil segera setelah eksekusi meninggalkan ruang lingkup using
blok, apa pun cara yang diperlukan untuk meninggalkan blok, baik itu akhir eksekusi blok, return
pernyataan, atau pengecualian.
Seperti yang ditunjukkan dengan benar oleh @Noldorin, menggunakan using
blok dalam kode dikompilasi menjadi try
/ finally
, dengan Dispose
dipanggil di finally
blok tersebut. Misalnya kode berikut:
using(MemoryStream ms = new MemoryStream())
{
//code
return 0;
}
efektif menjadi:
MemoryStream ms = new MemoryStream();
try
{
// code
return 0;
}
finally
{
ms.Dispose();
}
Jadi, karena finally
dijamin akan dieksekusi setelah try
blok selesai dieksekusi, terlepas dari jalur eksekusinya, Dispose
dijamin akan dipanggil, apa pun yang terjadi.
Untuk informasi selengkapnya, lihat artikel MSDN ini .
Tambahan:
Sedikit peringatan untuk ditambahkan: karena Dispose
dijamin akan dipanggil, adalah ide bagus untuk memastikan bahwa Dispose
tidak pernah ada pengecualian saat Anda menerapkan IDisposable
. Sayangnya, ada beberapa kelas di pustaka inti yang melakukannya dalam keadaan tertentu ketika Dispose
dipanggil - Saya melihat Anda, Referensi Layanan WCF / Proksi Klien! - dan ketika itu terjadi, akan sangat sulit untuk melacak pengecualian asli jika Dispose
dipanggil selama pengecualian tumpukan rileks, karena pengecualian asli ditelan demi pengecualian baru yang dihasilkan oleh Dispose
panggilan tersebut. Ini bisa sangat membuat frustrasi. Atau apakah itu membuat frustrasi? Salah satu dari keduanya. Mungkin keduanya.