Мне кажется, что лучший способ сделать это в общем зачете будет иметь FileStream закрывалась сама. Он не подразумевает знания о чем-либо, что существует в слое выше самого себя, поэтому для него действительно является ошибкой делать что-либо, что может повлиять на эти более высокие уровни.
Сказав, что эти конструкции более высокого уровня не должны аксиоматически предполагать что-либо о какой-либо поставки базового слоя, а также, или, если они делают это, они должны делать это в явном виде:
1) Если он был создан из существующий поток, то конструкция более высокого уровня должна быть закрыта НЕЗАВИСИМЫЙ базового потока (фактически просто распоряжающегося любыми ресурсами, выделенными для собственного использования) или закрытым ВКЛЮЧАЯ базовый поток. Это должны быть два различных вызова функций, например Close() и CloseSelf() (если это должно было быть реализовано таким образом, чтобы быть обратно совместимым с существующим кодом).
2) Если он не был создан из существующего потока (т. Е. Конструктор должен был создать базовый поток), то закрытие конструкции более высокого уровня должно также привести к тому, что основной поток закроется, поскольку в этом случае базовый поток является неявной частью конструкции более высокого уровня. В этом случае CloseSelf() просто вызовет Close().
Кажется расточительным реализовать эти классы так, как это было сделано.Если вы планируете использовать тот же файл для (в качестве примера) последовательного ввода и последовательного вывода, вы фактически вынуждены системой рассматривать его как два разных объекта, если вы хотите получить доступ к функциям более высокого уровня классов потомков. Ваша альтернатива заключается в том, чтобы придерживаться конструкции нижнего уровня и реализовывать функции более высокого уровня самостоятельно - эффективно перепрофилировать собственные специальные версии классов потомков, которые уже существуют.
Если бы это было сделано, как описано выше, типичная функциональность была бы такой же простой, как сейчас, но для более сложных приложений можно было бы сохранить единую блокировку в файле и повторно использовать ее как требуется, когда требуется, в отличие от необходимости отказаться от блокировки и всех связанных ресурсов, а затем мгновенно перераспределять их снова и снова - добавление служебных данных и фрагментации памяти в систему без уважительной причины.
В существующих условиях, однако, правильная вещь понятна. FileStream не может предполагать, что он знает что-либо о любом объекте, в котором он становится частью, поэтому вы должны закрыть самую внешнюю конструкцию. Это применимо независимо от того, работает ли он в любом случае, как отметил Бруно и другие, и по той причине, что они дали, - совместимость. Успение - правнук ужасных ошибок.
Возможный дубликат [Устраняет ли поток streamstreamer поток?] (Http://stackoverflow.com/questions/1065168/does-disposing-streamreader-close-the-stream) – mafu