Có, Dispose
sẽ được gọi. Nó được gọi ngay khi việc thực thi rời khỏi phạm vi của using
khối, bất kể phương tiện nào để rời khỏi khối, có thể là khi kết thúc quá trình thực thi khối, một return
câu lệnh hay một ngoại lệ.
Như @Noldorin đã chỉ ra một cách chính xác, việc sử dụng một using
khối trong mã sẽ được biên dịch thành try
/ finally
, với Dispose
việc được gọi trong finally
khối. 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 thi sau khi try
khối kết thúc thực thi, bất kể đường dẫn thực thi của nó Dispose
là gì , được đảm bảo sẽ được gọi, bất kể điều gì.
Để biết thêm thông tin, hãy xem bài viết MSDN này .
Phụ lục:
Chỉ cần lưu ý một chút: vì Dispose
được đảm bảo sẽ được gọi, nên hầu như luôn luôn là một ý kiến hay để đảm bảo rằng Dispose
không bao giờ có ngoại lệ khi bạn triển khai IDisposable
. Thật không may, có một số lớp trong thư viện lõi có thể xảy ra trong một số trường hợp nhất định khi Dispose
được gọi - Tôi đang nhìn bạn, WCF Service Reference / 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 thời gian thư giãn ngăn xếp ngoại lệ, vì ngoại lệ ban đầu bị nuốt có lợi cho ngoại lệ mới được tạo bởi Dispose
cuộc gọi. Nó có thể gây thất vọng tột độ. Hay đó là sự bực bội điên cuồng? Một trong hai. Có thể là cả hai.