Это больше похоже на теоретическую проблему, чем на практическую. Я не могу вспомнить ни одной ситуации, в которой поток стал бы нечитаемым / не записываемым другим , чем из-за его закрытия.
Вполне могут быть и угловые случаи, но я бы не ожидал, что они вообще будут часто появляться. Я не думаю, что подавляющее большинство кода должно беспокоиться об этом.
Хотя это интересная философская проблема.
РЕДАКТИРОВАТЬ: Обращаясь к вопросу о том, полезны ли CanRead и т. Д., Я считаю, что они все еще - в основном для проверки аргументов. Например, просто потому, что метод принимает поток, который он захочет прочитать в какой-то момент, не означает, что он хочет прочитать его прямо в начале метода, но именно здесь в идеале должна выполняться проверка аргумента. Это на самом деле ничем не отличается от проверки, является ли параметр нулевым, и выдачи ArgumentNullException
вместо ожидания выдачи NullReferenceException
, когда вы впервые разыменовываете его.
Кроме того, CanSeek
немного отличается: в некоторых случаях ваш код вполне может справиться как с поисковыми, так и с неисследуемыми потоками, но с большей эффективностью в случае с поиском.
Это зависит от того, что «поиск» и т. Д. Остается неизменным - но, как я уже сказал, это похоже на правду в реальной жизни.
Хорошо, давайте попробуем изложить это по-другому ...
Если вы не читаете / ищите в памяти и уже убедились, что данных достаточно, или вы записываете в предварительно выделенный буфер, то всегда может привести к ошибкам. Диски выходят из строя или заполняются, сети разрушаются и т. Д. Такие вещи do случаются в реальной жизни, поэтому вам всегда нужно кодировать таким образом, чтобы пережить сбой (или сознательно выбрать игнорировать проблему, когда это не действительно важно).
Если ваш код может правильно действовать в случае сбоя диска, скорее всего, он сможет пережить FileStream
, превратившись из записываемого в недоступный для записи.
Если бы у Stream
были твердые контракты, они должны были бы быть невероятно слабыми - вы не могли бы использовать статическую проверку, чтобы доказать, что ваш код всегда будет работать. Лучшее, что вы можете сделать, это доказать, что он поступил правильно перед лицом неудачи.
Я не верю, что Stream
скоро изменится. Хотя я, конечно, признаю, что это может быть лучше задокументировано, я не принимаю идею, что это «полностью сломано». Было бы больше сломано, если бы мы не могли использовать его в реальной жизни ... и если бы оно могло быть более сломанным, чем сейчас, логически оно не полностью сломано.
У меня гораздо большие проблемы с фреймворком, такие как относительно плохое состояние API даты / времени. Они стали на много лучше в последних двух версиях, но им все еще не хватает многих функций (скажем) Joda Time . Отсутствие встроенных неизменяемых коллекций, плохая поддержка неизменяемости в языке и т. Д. - это реальные проблемы, которые вызывают у меня настоящих головных болей. Я бы предпочел увидеть их адресованными, чем потратить целую вечность на Stream
, что мне кажется несколько неразрешимой теоретической проблемой, которая вызывает мало вопросов в реальной жизни.