2010-10-03 29 views
6

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

11

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 Disposeluô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.

+0

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

+0

@Ben rất đúng. Tôi sẽ chỉ rõ điều đó. –

+0

Có một 'null'-kiểm tra trong khối' cuối cùng' là tốt. – Ani

2

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().

2

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(); 
} 
Các vấn đề liên quan