2009-07-03 27 views
9

Có mã này:Chúng ta có cần đóng C# BinaryWriter hoặc BinaryReader trong một khối sử dụng không?

using (BinaryWriter writer = new BinaryWriter(File.Open(ProjectPath, FileMode.Create))) 
{ 
    //save something here 
} 

Chúng ta cần phải đóng BinaryWriter? Nếu không, tại sao?

+0

Mặc dù thực tế đó là một loại khác, đây là bản sao của http://stackoverflow.com/questions/1070667/is-is-necessary-to-dispose-dbcommand-after-use/. Tôi muốn bỏ phiếu để đóng cửa, nhưng đã đạt đến giới hạn của tôi trong ngày. Tôi đề nghị rằng chúng tôi không cần một câu hỏi "tôi nên bỏ một lớp thực hiện IDisposable" cho mỗi lớp thực hiện nó. Vui lòng xem xét bỏ phiếu để đóng như một bản sao của câu hỏi IDisposable yêu thích của bạn. –

+0

Bạn thực sự hiểu rằng đây là lỗi thiết kế/tài liệu API: trình biên dịch sẽ cảnh báo bạn khi bạn mắc lỗi rõ ràng và tài liệu cần ghi rõ các cuộc gọi Close() nào tương đương với Dispose (và tốt nhất là không có bất kỳ các cuộc gọi Close() hoàn toàn không cần thiết ngay từ đầu). –

Trả lời

18

Miễn là tất cả được gói trong khối using thì bạn không cần gọi rõ ràng Close.

Khối using sẽ đảm bảo rằng đối tượng được xử lý và các phương pháp CloseDispose có thể hoán đổi cho nhau trên BinaryWriter. (Phương pháp Close chỉ cần gọi Dispose phía sau hậu trường.)

4

Với mã bạn có ở đó, nó sẽ đóng tệp khi nó thoát khỏi khối đang sử dụng, do đó bạn không cần phải gọi gần đúng cách.

Lý do duy nhất không sử dụng báo cáo sử dụng sẽ là nếu bạn muốn tệp vẫn mở sau khi bạn hoàn thành công cụ BinaryWriter, trong trường hợp đó bạn nên giữ tham chiếu thay vì chuyển nó vào constructor như thế.

4

Đưa nó vào một câu lệnh sử dụng theo ví dụ mã của bạn sẽ gọi Vứt bỏ, đóng dòng cơ bản, vì vậy không. Bạn có thể thấy điều này thông qua Reflector:

protected virtual void Dispose(bool disposing) 
{ 
    if (disposing) 
    { 
     this.OutStream.Close(); 
    } 
} 
0

Khối sử dụng sẽ tự động đóng trình ghi nhị phân và đặt trạng thái là GC'ed. Việc sử dụng các khối là đường cú pháp để thực hiện xử lý ngoại lệ và tự đóng luồng.

0

Bằng cách gói người viết lên trong khối sử dụng, đóng sẽ tự động xảy ra khi người viết được xử lý. Vì vậy, trong trường hợp này, bạn không cần phải đóng một cách rõ ràng người viết.

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