Có, Disposesẽ được gọi. Nó được gọi ngay khi việc thực thi rời khỏi phạm vi của usingkhố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 returncâ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 usingkhối trong mã sẽ được biên dịch thành try/ finally, với Disposeviệc được gọi trong finallykhố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 trykhối kết thúc thực thi, bất kể đường dẫn thực thi của nó Disposelà 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 Disposekhô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 Disposecuộ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.