Dường như với tôi rằng cách tốt nhất để làm tổng thể này sẽ có FileStream chỉ đóng chính nó. Nó không ngầm có kiến thức về bất cứ điều gì tồn tại trong một lớp trên chính nó, do đó, nó có hiệu quả là một lỗi cho nó để làm bất cứ điều gì mà sẽ ảnh hưởng đến những lớp cao hơn.
Có nói rằng, các cấu trúc cấp cao không nên axiomatically giả gì về bất kỳ lớp cơ bản được cung cấp là tốt, hoặc nếu họ làm như vậy, họ nên làm như vậy một cách rõ ràng:
1) Nếu nó đã được tạo ra từ một luồng hiện tại, thì cấu trúc cấp cao hơn sẽ có thể đóng ĐỘC QUYỀN luồng cơ bản (chỉ xử lý bất kỳ tài nguyên nào được phân bổ để sử dụng riêng) hoặc đóng BAO GỒM luồng cơ bản. Đây nên là hai cuộc gọi hàm riêng biệt, ví dụ Close() và CloseSelf() (nếu điều này được thực hiện theo cách tương thích ngược với mã hiện có).
2) Nếu nó không được tạo từ luồng hiện có (nghĩa là hàm tạo phải tạo luồng cơ bản), thì đóng cấu trúc cấp cao hơn cũng buộc luồng cơ bản đóng lại, vì trong trường hợp đó luồng cơ bản là một phần ngầm của cấu trúc cấp cao hơn. Trong trường hợp này, CloseSelf() đơn giản gọi Close().
Có vẻ như lãng phí khi triển khai các lớp này theo cách thực hiện.Nếu bạn định sử dụng cùng một tệp cho đầu vào nối tiếp (ví dụ) và đầu ra nối tiếp, bạn bị hệ thống buộc phải coi nó là hai thực thể riêng biệt nếu bạn muốn truy cập vào chức năng cấp cao hơn của các lớp hậu duệ. Cách khác của bạn là gắn bó với cấu trúc mức thấp hơn và tự thực hiện chức năng cấp cao hơn - thực hiện lại hiệu quả các phiên bản đặc biệt của các lớp con cháu đã tồn tại của bạn.
Nếu nó được thực hiện như mô tả ở trên, thì chức năng điển hình sẽ đơn giản như hiện nay, nhưng đối với các ứng dụng phức tạp hơn, ứng dụng sẽ duy trì khả năng đặt một khóa trên một tệp và tái sử dụng nó yêu cầu khi được yêu cầu trái ngược với việc phải từ bỏ khóa và tất cả các tài nguyên liên quan và sau đó ngay lập tức phân bổ lại tất cả chúng - thêm chi phí và phân mảnh bộ nhớ vào hệ thống mà không có bất kỳ lý do hợp lệ nào.
Trong điều kiện hiện tại, tuy nhiên, điều đúng là rõ ràng. FileStream không thể được giả định để biết bất cứ điều gì về bất kỳ đối tượng nó trở thành một phần của, vì vậy bạn phải đóng cấu trúc bao ngoài cùng. Điều này áp dụng bất kể nó có hoạt động theo cách nào hay không, như Bruno và cộng sự đã lưu ý, và vì lý do họ đưa ra - tính tương thích. Giả định là tuyệt vời-granddy của các lỗi xấu nhất.
bản sao có thể có của [Không xử lý luồng đóng luồng?] (Http://stackoverflow.com/questions/1065168/does-disposing-streamreader-close-the-stream) – mafu