Почему класс StringBuilder не унаследован от Stream? - PullRequest
4 голосов
/ 30 января 2009

Мне просто интересно об этом. Мне кажется, что поведение StringBuilder функционально (если не технически) совпадает с потоком - это набор данных, в который могут быть добавлены другие данные.

Опять просто любопытно.

Ответы [ 6 ]

10 голосов
/ 30 января 2009

Поток является входом и выходом двоичных данных.

StringBuilder - это средство создания текста данных.

Помимо этого, существует проблема состояния - StringBuilder просто имеет текущее значение, без понятия «позиция». Это позволяет вам получать доступ и изменять данные в любом месте. Поток, с другой стороны, является логически потенциально бесконечным потоком данных, с курсором где-то посередине, чтобы сказать, куда вам нужно. Как правило, вы просто читаете / пишете вперед, используя Seek / Position для перехода к определенной части потока данных.

Попробуйте представить реализацию Stream API с помощью StringBuilder ... он просто не подходит. Вы могли бы отсортировать этого, но в итоге вы получите StringReader и StringWriter.

10 голосов
/ 30 января 2009

StringBuilder имеет больше, чем просто функции добавления. У этого также есть функции вставки, которые неестественны для потока. Используйте класс StringWriter, если вы хотите, чтобы поток обернул StringBuilder.

6 голосов
/ 30 января 2009

Поток обычно относится к внешнему источнику ввода / вывода (файл, сеть). StringBuilder не имеет такой характеристики.

3 голосов
/ 30 января 2009

Потому что это не совсем поток. Это больше буфера, который растет.

1 голос
/ 30 января 2009

С другой стороны, вы найдете классы StringReader / Writer в System.IO. StringWriter например реализует TextWriter против базового StringBuilder .

Лично я никогда не использовал его, но если у вас есть подпрограмма записи текстового файла, вы можете заставить его работать против TextWriter . Затем в своем тесте вместо создания StreamWriter вы создаете экземпляр StringWriter и затем можете проверить, что было написано, посмотрев на базовый StringBuilder .

Теперь у меня кружится голова ...

1 голос
/ 30 января 2009

Хотя к обоим можно добавить данные, функциональность в целом различна.

Поток предназначен для ввода или вывода данных из / в некоторый источник, а не для построения чего-либо. StringBuilder не нуждается в функциональности, предоставляемой Stream, такой как буферизация и т. Д. Для создания ресурса.

...