2009-06-23 44 views

Trả lời

26

Đầu tiên là tốt hơn. Nó đảm bảo nó được xử lý ngay cả khi một ngoại lệ được ném ra, và nó xử lý chính xác trường hợp trong đó Create(0) trả về null (tức là nó không cố gắng gọi Dispose() trên một trường hợp rỗng).

+0

Cảm ơn bạn! Đó chỉ là loại câu trả lời tôi đang tìm kiếm. – mkelley33

+11

Một điểm bổ sung nhỏ mà không ai đề cập là sử dụng "sử dụng" ngăn bạn vô tình biến đổi nội dung của biến "ctx" sau khi khởi tạo nhưng trước khi xử lý. Bạn không muốn vô tình vứt bỏ một đối tượng khác với đối tượng bạn đã tạo. –

2

Tuyên bố sử dụng cung cấp cho bạn cú pháp đẹp và bảo vệ ngoại lệ. Bạn không thể rời khỏi câu lệnh sử dụng mà không cần gọi Dispose (nó chuyển thành một khối cuối cùng với một cuộc gọi để xử lý). Trong kịch bản thứ hai của bạn, nếu bạn có ngoại lệ giữa Tạo và Vứt bỏ, bạn sẽ không gọi trực tiếp. Đó không phải là một vấn đề, trừ khi bạn đang sử dụng tài nguyên không được quản lý, nhưng nếu bạn đang có, bạn sẽ bị rò rỉ.

3

Nơi bạn có thể, hãy sử dụng using vì những lý do Marc trích dẫn. OTOH đây không phải là giải pháp chết não vì đôi khi tuổi thọ của đối tượng không thể được định nghĩa là phạm vi từ vựng để sử dụng nó một cách hợp lý.

3

Nơi duy nhất bạn không muốn sử dụng khối sử dụng là nơi đối tượng dùng một lần được đặt bên ngoài chức năng. Trong trường hợp này, lớp của bạn nên thực hiện IDisposable và vứt bỏ đối tượng trong Dispose() của nó.

+0

Tôi đã chạy vào các trường hợp mà tuổi thọ của đối tượng ngắn hơn tuổi thọ của chủ sở hữu. – BCS

7

Một tuyên bố using phải lúc nào cũng tốt hơn vì ...

  • bạn không thể quên gọi Dispose(), thậm chí là mã phát triển thành đường dẫn mã khác nhau
  • Dispose() được gọi thậm chí nếu có một ngoại lệ. Nó cũng kiểm tra null trước khi gọi Dispose(), có thể hữu ích (giả sử bạn không chỉ gọi số new).

Một không rõ ràng (đối với tôi, dù sao) lừa với using là làm thế nào bạn có thể tránh làm tổ quá mức khi bạn có nhiều đối tượng dùng một lần:

using (var input = new InputFile(inputName)) 
using (var output = new OutputFile(outputName)) 
{ 
    input.copyTo(output); 
} 

Các VS đang formatter sẽ rời khỏi hai câu lệnh bắt đầu trong cùng một cột.


Trong thực tế, trong một số trường hợp, bạn thậm chí không cần phải lặp lại các tuyên bố sử dụng ...

using (InputFile input1 = new InputFile(inputName1), input2 = new InputFile(inputName2)) 

Tuy nhiên, các hạn chế đối với tuyên bố nhiều biến trên cùng một dòng áp dụng ở đây như vậy các loại phải giống nhau và bạn không thể sử dụng loại ẩn var.

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