ใช่Disposeจะเรียกว่า เรียกว่าทันทีที่การดำเนินการออกจากขอบเขตของusingบล็อกไม่ว่าจะใช้วิธีใดในการออกจากบล็อกไม่ว่าจะเป็นการสิ้นสุดการดำเนินการของบล็อกreturnคำสั่งหรือข้อยกเว้น
ดังที่ @Noldorin ชี้ให้เห็นอย่างถูกต้องการใช้usingบล็อกในโค้ดจะถูกคอมไพล์เป็นtry/ finallyโดยDisposeถูกเรียกในfinallyบล็อก ตัวอย่างเช่นรหัสต่อไปนี้:
using(MemoryStream ms = new MemoryStream())
{
//code
return 0;
}
อย่างมีประสิทธิภาพกลายเป็น:
MemoryStream ms = new MemoryStream();
try
{
// code
return 0;
}
finally
{
ms.Dispose();
}
ดังนั้นเนื่องจากfinallyมีการรับประกันว่าจะดำเนินการหลังจากtryบล็อกเสร็จสิ้นการดำเนินการโดยไม่คำนึงถึงเส้นทางการดำเนินการDisposeจึงรับประกันได้ว่าจะถูกเรียกไม่ว่าจะเกิดอะไรขึ้นก็ตาม
สำหรับข้อมูลเพิ่มเติมโปรดดูที่บทความนี้ MSDN
ภาคผนวก:
เพียงแค่คำเตือนเล็ก ๆ น้อย ๆ เพื่อเพิ่ม: เนื่องจากDisposeมีการประกันที่จะเรียกว่ามันมักจะเป็นความคิดที่ดีเพื่อให้มั่นใจว่าไม่เคยพ่นยกเว้นเมื่อคุณใช้Dispose IDisposableแต่มีบางชั้นเรียนในห้องสมุดหลักที่ทำจากเส้นข้างในบางสถานการณ์เมื่อDisposeถูกเรียกว่า - ฉันกำลังมองหาที่คุณ WCF บริการอ้างอิง / พร็อกซี่ไคลเอนต์! - และเมื่อสิ่งนี้เกิดขึ้นอาจเป็นเรื่องยากมากที่จะติดตามข้อยกเว้นเดิมหากDisposeถูกเรียกในระหว่างที่สแตกข้อยกเว้นคลายตัวเนื่องจากข้อยกเว้นเดิมถูกกลืนไปกับข้อยกเว้นใหม่ที่สร้างขึ้นโดยการDisposeโทร อาจเป็นเรื่องน่าหงุดหงิดอย่างยิ่ง หรือนั่นเป็นเรื่องที่น่าหงุดหงิด? หนึ่งในสอง อาจจะทั้งสองอย่าง