Tôi sẽ đưa ra ý kiến bất đồng ý kiến. Câu trả lời cho câu hỏi cụ thể "Có cần thiết phải bao bọc StreamWriter trong một khối sử dụng không?" Trên thực tế, bạn không được cuộc gọi Vứt bỏ trên một StreamWriter, bởi vì Vứt bỏ nó được thiết kế tồi và làm điều sai trái.
Sự cố với StreamWriter là, khi bạn Vứt bỏ nó, nó sẽ loại bỏ luồng cơ bản. Nếu bạn đã tạo StreamWriter với tên tệp, và nó đã tạo ra một FileStream riêng trong nội bộ, thì hành vi này sẽ hoàn toàn thích hợp. Nhưng nếu, như ở đây, bạn đã tạo StreamWriter với luồng hiện tại, thì hành vi này hoàn toàn là Điều sai (tm). Nhưng nó vẫn làm.
Mã như thế này sẽ không làm việc:
var stream = new MemoryStream();
using (var writer = new StreamWriter(stream)) { ... }
stream.Position = 0;
using (var reader = new StreamReader(stream)) { ... }
vì khi using
khối của StreamWriter disposes StreamWriter, mà sẽ lần lượt vứt bỏ con suối. Vì vậy, khi bạn cố gắng đọc từ luồng, bạn sẽ nhận được một ObjectDisposedException.
StreamWriter là vi phạm nghiêm trọng quy tắc "dọn dẹp mớ hỗn độn của riêng bạn". Nó cố gắng làm sạch đống lộn xộn của người khác, cho dù họ có muốn hay không.
(Hãy tưởng tượng nếu bạn thử điều này trong thực tế đời sống. Hãy thử giải thích với cảnh sát tại sao bạn đã đột nhập vào nhà của người khác và bắt đầu ném tất cả các công cụ của họ vào thùng rác ...)
Vì lý do đó, tôi xem xét StreamWriter (và StreamReader, mà làm điều tương tự) là một trong số rất ít các lớp học, nơi "nếu nó thực hiện IDisposable, bạn nên gọi Dispose" là sai. Không bao giờ gọi Vứt bỏ trên StreamWriter được tạo trên luồng hiện có. Gọi Flush() để thay thế.
Sau đó, chỉ cần đảm bảo bạn dọn sạch Luồng khi cần. (Như Joe đã chỉ ra, ASP.NET phân phối Response.OutputStream cho bạn, vì vậy bạn không cần phải lo lắng về nó ở đây.)
Cảnh báo: nếu bạn không loại bỏ StreamWriter, thì bạn do cần gọi Flush() khi bạn viết xong. Nếu không, bạn có thể có dữ liệu vẫn đang được đệm trong bộ nhớ mà không bao giờ làm cho nó vào dòng đầu ra.
Quy tắc của tôi cho StreamReader là, giả vờ rằng nó không triển khai IDisposable. Chỉ cần để nó đi khi bạn đã hoàn tất.
Quy tắc của tôi cho StreamWriter là, hãy gọi Dọn dẹp nơi bạn có thể gọi là Vứt bỏ. (Điều này có nghĩa là bạn phải sử dụng số try
.. finally
thay vì using
.)
Nếu chương trình thoát, tay cầm sẽ được làm sạch. Câu lệnh sử dụng chỉ giúp trong khi ứng dụng đang chạy. –
finalizers là thuật ngữ cho những gì làm sạch trên lối ra. – Guvante