Nếu tôi sử dụng "sử dụng" xây dựng, tôi biết rằng đối tượng được tự động xử lý. Điều gì sẽ xảy ra nếu một câu lệnh bên trong một cấu trúc "đang sử dụng" đặt ra một ngoại lệ. Đối tượng "đang sử dụng" vẫn được xử lý? Nếu sau đó?cơ bản về "sử dụng" xây dựng
Trả lời
Một khối using
được chuyển đổi - bởi trình biên dịch - đến nay:
DisposableType yourObj = new DisposableType();
try
{
//contents of using block
}
finally
{
((IDisposable)yourObj).Dispose();
}
Bằng cách đặt các Dispose()
cuộc gọi trong khối finally
, nó đảm bảo Dispose
là luôn gọi - tất nhiên trừ khi các ngoại lệ xảy ra ở trang web khởi tạo, vì điều đó xảy ra bên ngoài try
. Điều quan trọng là phải nhớ rằng using
không phải là một loại toán tử đặc biệt hoặc cấu trúc - nó chỉ là thứ mà trình biên dịch thay thế bằng một thứ khác hơi ngớ ngẩn hơn một chút.
This article explains it nicely.
Bên trong, bad boy này tạo ra một thử/cuối cùng xung quanh đối tượng được cấp phát và gọi Dispose() cho bạn. Nó giúp bạn tiết kiệm được những rắc rối khi tạo thủ công khối try/finally và gọi Dispose().
Thực tế việc sử dụng khối tương đương với khối thử - cuối cùng, Điều nào đảm bảo rằng cuối cùng sẽ luôn thực thi, ví dụ:
using (SqlConnection con = new SqlConnection(ConnectionString))
{
using (SqlCommand cmd = new SqlCommand("Command", con))
{
con.Open();
cmd.ExecuteNonQuery();
}
}
Equals để
SqlConnection con = null;
SqlCommand cmd = null;
try
{
con = new SqlConnection(ConnectionString);
cmd = new SqlCommand("Command", con);
con.Open();
cmd.ExecuteNonQuery();
}
finally
{
if (null != cmd);
cmd.Dispose();
if (null != con)
con.Dispose();
}
- 1. Xây dựng ứng dụng sử dụng maven
- 2. Xamarin: sử dụng NDK-xây dựng .so
- 3. Xây dựng ứng dụng Android nhanh - Java hoặc bản địa?
- 4. .template (dot-mẫu) sử dụng xây dựng
- 5. Sử dụng cơ chế tuần tự hóa/deserialization RPC được xây dựng trong GWT
- 6. Tại sao Python xây dựng đột ngột không phải khung xây dựng khi sử dụng virtualenv?
- 7. Bạn có thể sử dụng tệp xây dựng ANT làm tệp xây dựng Phing không?
- 8. Sử dụng Reflection để xây dựng một Class (để xây dựng một lớp FileHelper động)
- 9. Cơ sở dữ liệu xây dựng quy trình quản lý
- 10. XPathDocument có sử dụng luồng bộ nhớ được xây dựng sau khi xây dựng không?
- 11. Xây dựng trình tự khi sử dụng điều khiển phiên bản được phân phối
- 12. Cờ xây dựng Android?
- 13. Nhà xây dựng bản sao Weird
- 14. Các phương pháp hay nhất về xây dựng một trang web bằng cách sử dụng Node.js
- 15. Xcode Gettings Phiên bản & Xây dựng Số
- 16. Làm thế nào: Ruby on Rails để xây dựng một trang web cơ bản
- 17. Bạn sử dụng bộ âm thanh xây dựng nào?
- 18. Sử dụng nhiều chuỗi nhà xây dựng cho một chuỗi
- 19. Xây dựng DOJO không bao gồm cơ sở DOJO
- 20. Sử dụng JQuery để xây dựng một neo
- 21. thông tin phiên bản xây dựng maven
- 22. Hook để thêm lệnh vào các bản dựng xây dựng?
- 23. Sử dụng cơ bản Generics
- 24. Sử dụng Hudson để xây dựng gói RPM
- 25. Làm thế nào để xây dựng một Terminal cơ bản từ đầu
- 26. Khi nào cần sử dụng công cụ xây dựng?
- 27. Cách sử dụng kiến để xây dựng với android
- 28. cách định cấu hình tác nhân xây dựng tfs để xây dựng hồ sơ xuất bản?
- 29. Sử dụng tính năng tiêm thay vì tiêm xây dựng
- 30. Hiểu cơ bản về socket
Nó cũng quan trọng cần lưu ý rằng, như ví dụ của bạn minh họa, nếu cuộc gọi đến DisposableType() ném một ngoại lệ, Dispose() sẽ không được gọi là; bất kỳ tài nguyên nào được phân bổ ở đó trước khi ngoại lệ sẽ không được phát hành. – Ben
@Ben rất đúng. Tôi sẽ chỉ rõ điều đó. –
Có một 'null'-kiểm tra trong khối' cuối cùng' là tốt. – Ani