2011-11-23 40 views
13

thể trùng lặp:
Does Dispose method still get called when Exception is thrown inside of Using statment?Tài nguyên có được xử lý ngay cả khi một ngoại lệ được ném vào một khối sử dụng không?

Tôi đã có một số using khối, khi truy cập vào một cơ sở dữ liệu. Tôi đã tự hỏi - nếu một ngoại lệ phải được ném vào trong khối sử dụng, liệu các tài nguyên cần thiết vẫn được xử lý, mặc dù kết thúc của khối không đạt được? Hoặc tôi có cần phải tự đóng chúng theo cách thủ công trong khối catch không?

Trả lời

26

Các tài nguyên được xác định với tuyên bố using đã được xử lý, đây là lý do chính khiến using là phù hợp.

Những tuyên bố sử dụng đảm bảo rằng Dispose được gọi thậm chí nếu một ngoại lệ xảy ra trong khi bạn đang gọi phương pháp trên đối tượng. Bạn có thể đạt được kết quả tương tự bằng cách đặt đối tượng vào trong khối thử và rồi gọi Vứt bỏ trong một khối cuối cùng; trên thực tế, đây là cách câu lệnh sử dụng được dịch bởi trình biên dịch.
http://msdn.microsoft.com/en-us/library/yh598w02%28v=VS.100%29.aspx

+1

+1 cho liên kết đến mô tả và là 15 giây. nhanh hơn tôi. ;-) – Fischermaen

+0

Cảm ơn! Chỉ cần chờ bộ đếm thời gian để chấp nhận câu trả lời :) –

+0

và trong khi đó tôi nhận được -1 ... – Fischermaen

1

Có, tài nguyên của khối sử dụng sẽ được xử lý.

1

Bạn sẽ không làm như vậy. Trên thực tế, khối using giống nhau nếu bạn sử dụng công cụ try{}catch{}finally{} với lệnh Gọi phương thức vứt bỏ trong khối cuối cùng. Vì vậy, nó sẽ được gọi là anyway.

1

Có, phần tử sẽ được xử lý, vì cuộc gọi là một phần của khối finally của try mà trong đó using dịch.

Từ 8.13 của C# đặc điểm kỹ thuật:

Một tuyên bố sử dụng được dịch thành ba phần: thu thập, sử dụng, và xử lý. Việc sử dụng tài nguyên được bao bọc hoàn toàn trong câu lệnh try bao gồm mệnh đề cuối cùng. Điều khoản cuối cùng này phân bổ tài nguyên. Nếu một tài nguyên rỗng được mua lại, sau đó không có cuộc gọi đến Vứt bỏ được thực hiện, và không có ngoại lệ được ném.

Vì vậy, bạn sẽ không cần phải vứt bỏ thủ công theo cách thủ công và tôi không chắc chắn về nơi mà khối catch của riêng bạn sẽ vẫn trong trường hợp này.

Các vấn đề liên quan