Ya, Disposeakan dipanggil. Ini dipanggil segera setelah eksekusi meninggalkan ruang lingkup usingblok, apa pun cara yang diperlukan untuk meninggalkan blok, baik itu akhir eksekusi blok, returnpernyataan, atau pengecualian.
Seperti yang ditunjukkan dengan benar oleh @Noldorin, menggunakan usingblok dalam kode dikompilasi menjadi try/ finally, dengan Disposedipanggil di finallyblok 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 finallydijamin akan dieksekusi setelah tryblok selesai dieksekusi, terlepas dari jalur eksekusinya, Disposedijamin akan dipanggil, apa pun yang terjadi.
Untuk informasi selengkapnya, lihat artikel MSDN ini .
Tambahan:
Sedikit peringatan untuk ditambahkan: karena Disposedijamin akan dipanggil, adalah ide bagus untuk memastikan bahwa Disposetidak pernah ada pengecualian saat Anda menerapkan IDisposable. Sayangnya, ada beberapa kelas di pustaka inti yang melakukannya dalam keadaan tertentu ketika Disposedipanggil - Saya melihat Anda, Referensi Layanan WCF / Proksi Klien! - dan ketika itu terjadi, akan sangat sulit untuk melacak pengecualian asli jika Disposedipanggil selama pengecualian tumpukan rileks, karena pengecualian asli ditelan demi pengecualian baru yang dihasilkan oleh Disposepanggilan tersebut. Ini bisa sangat membuat frustrasi. Atau apakah itu membuat frustrasi? Salah satu dari keduanya. Mungkin keduanya.