Có, Dispose
sẽ được gọi. Nó được gọi ngay sau khi thực hiện rời khỏi phạm vi của khối using
, bất kể những gì có nghĩa là nó đã rời khỏi khối, có thể là kết thúc thực hiện của khối, một tuyên bố return
, hoặc một ngoại lệ.
Như @Noldorin một cách chính xác chỉ ra, sử dụng một khối using
trong mã được biên dịch vào try
/finally
, với Dispose
được gọi trong khối finally
. Ví dụ đoạn mã sau:
using(MemoryStream ms = new MemoryStream())
{
//code
return 0;
}
hiệu quả trở thành:
MemoryStream ms = new MemoryStream();
try
{
// code
return 0;
}
finally
{
ms.Dispose();
}
Vì vậy, bởi vì finally
được đảm bảo để thực hiện sau khi khối try
đã hoàn tất thi công, bất kể con đường thực hiện của nó, Dispose
là đảm bảo được được gọi là, không có vấn đề gì.
Để biết thêm thông tin, hãy xem this MSDN article.
Phụ Lục:
Chỉ cần một caveat chút để thêm: vì Dispose
được đảm bảo để được gọi, nó gần như luôn luôn là một ý tưởng tốt để đảm bảo rằng Dispose
bao giờ ném một ngoại lệ khi bạn thực hiện IDisposable
. Thật không may, có một số lớp học trong thư viện lõi rằng làm ném trong một số trường hợp khi Dispose
được gọi là - Tôi đang xem bạn, WCF Dịch vụ tham khảo/Client Proxy! - và khi điều đó xảy ra, có thể rất khó theo dõi ngoại lệ ban đầu nếu Dispose
được gọi trong một ngoại lệ ngăn xếp ngoại lệ, vì ngoại lệ ban đầu bị nuốt theo lợi thế của ngoại lệ mới được tạo bởi cuộc gọi Dispose
. Nó có thể gây phiền toái. Hay là bực mình? Một trong hai. Có thể là cả hai.
@JonH: Tìm chính xác bản sao, sau đó bỏ phiếu để đóng trong trường hợp đó xin vui lòng. – Noldorin
@Noldorin: Tôi đã đi tìm kiếm một sự lừa dối về điều này, bởi vì tôi đã nhận ra nó * phải * đã được hỏi trước đây, nhưng tôi không thể tìm thấy nó. Tôi đoán vẫn còn những câu hỏi dễ dàng. :) – Randolpho
@JonH và @Noldorin - các bản sao sẽ được trình bày khi câu hỏi được hình thành, nó tìm kiếm "các câu hỏi tương tự", một tính năng mà mọi người dường như không sử dụng đủ. –