ใช่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
โทร อาจเป็นเรื่องน่าหงุดหงิดอย่างยิ่ง หรือนั่นเป็นเรื่องที่น่าหงุดหงิด? หนึ่งในสอง อาจจะทั้งสองอย่าง