2012-08-29 47 views
9

Cả hai BinaryReaderconstructors yêu cầu thông số luồng. Nếu tôi cần giữ luồng cơ bản như khi tôi hoàn thành với BinaryReader, tôi có nên gọi số Dispose() của mình không? Nếu không, có cách nào khác dọn dẹp không còn cần thiết BinaryReader không?Tôi có nên vứt bỏ một BinaryReader nếu tôi cần bảo quản luồng "được bao bọc"?

Tôi hỏi vì tôi không thể tìm thấy câu trả lời rõ ràng trên MSDN page for BinaryReader.Dispose().

addtion nhỏ

Trong bối cảnh của tôi, tôi sử dụng BinaryReader để đọc một vài byte, sau đó tôi thiết lập vị trí của các dòng trở lại với những gì nó đã được trước khi BinaryReader được khởi tạo.

Ngoài ra, tôi đang sử dụng Net 4.

Trả lời

11

Không, nó là tốt để không vứt bỏ các BinaryReader nếu bạn muốn giữ lại dòng mở.

tôi có lẽ muốn thêm một bình luận để giải thích những gì đang xảy ra mặc dù - và tôi không chắc chắn cho dù đó là đảm bảo rằng BinaryReader sẽ chỉ đọc từ dòng như xa như bạn đã đọc từ BinaryReader. .. nó có thể đã đọc nhiều hơn vào một bộ đệm, ví dụ. Rõ ràng đó không phải là vấn đề nếu bạn tìm kiếm trên luồng.

+0

có Tôi đã cập nhật câu hỏi của mình để đề cập đến tôi chỉ đọc một vài byte với 'BinaryReader'. –

12

Nếu bạn (hoặc bất kỳ ai khác đang đọc những câu trả lời này) đang sử dụng VS 2012 với .NET 4.5 (hoặc mới hơn), bạn có thể tạo BinaryReader sẽ không đóng luồng. Ví dụ .:

using(var reader = new BinaryReader(theStream, new UTF8Encoding(), true) 
{ 
//... 
} 

new UTF8Encoding là mặc định nếu bạn sử dụng constructor BinaryReader (Stream), nếu bạn không muốn UTF8Encoding, bạn có thể sử dụng cái gì khác. true có nghĩa là "có, hãy để luồng mở".

2

Nếu là tôi, tôi muốn vứt bỏ của BinaryReader, chỉ vì lợi ích của tidyness ... nhưng tôi cũng muốn đảm bảo rằng tôi đã tạo ra BinaryReader với this constructor overload này:

public BinaryReader(
    Stream input, 
    Encoding encoding, 
    bool  leaveOpen 
) 

nơi quy định cụ thể đối số leaveOpentrue hướng dẫn người đọc rời khỏi luồng cơ bản mở.

Đi tuyến đường này, bạn làm rõ phạm vi và quyền sở hữu của mọi thứ. Ít chỗ cho sự nhầm lẫn và hiểu lầm theo cách đó.

+1

Tôi đồng ý với bình luận của bạn 100%, và tôi có thể đã không hỏi câu hỏi nếu tôi đã sử dụng 4,5 vì tôi có lẽ đã nhận thấy đối số 'leaveOpen'. –

3

Hiện đã là một câu trả lời được chấp nhận, nhưng nó khiến tôi cảm thấy bẩn :-) Tôi nghĩ rằng chúng ta có thể làm tốt hơn:

  1. Nếu bạn đang sử dụng .NET 4.5, bạn nên sử dụng các nhà xây dựng 3-arg của BinaryReader. Làm xong.
  2. Nếu bạn đang sử dụng .NET 3.5/4.0, bạn cần một giải pháp khác nhau

Jon Skeet (câu trả lời được chấp nhận) cho thấy chỉ cần không bao giờ vứt bỏ những BinaryReader. Vâng, đó là hoạt động ofcourse, nhưng có thể là một nguồn của sự nhầm lẫn.

Một giải pháp thay thế có thể là để bọc luồng của bạn trong một NonClosingStreamWrapper, trước khi chuyển cho BinaryReader.BinaryReader sẽ đóng trình bao bọc khi nó được xử lý, nhưng NonClosingStreamWrapper sẽ không loại bỏ Luồng cơ bản của bạn. Bạn vẫn có thể sử dụng .Dispose trên binaryStream (hoặc thậm chí tốt hơn, sử dụng-pattern).

Rất trớ trêu thay, @JonSkeet đã tạo một NonClosingStreamWrapper để thực hiện điều đó. Đó là một phần của số miscutil library của anh ấy. (nhưng lưu ý giấy phép)

using(var reader = new BinaryReader(new NonClosingStreamWrapper(myStream))) 
{ 
//... 
} 
Các vấn đề liên quan