Другие уже сказали, но это потому, что они являются производными от TextReader / TextWriter и могут использоваться вместо них. С одной стороны, имеет смысл использовать тот же метод для вывода строк, который вы используете для файла, если вы хотите, чтобы содержимое было только строкой. Если вам нужен вывод, который будет занимать несколько строк в памяти, зачем беспокоиться о том, что нужно ставить «\ r \ n» в конце каждой строки с помощью StringBuilder? Что делать, если вы хотите, чтобы код запускался или форматировал данные для системы, которая использует только \ n для разрывов строк?
StringBuilder sb = new StringBuilder();
// will be invalid on systems that only use \n
sb.AppendFormat("{0:yyyy-MM-dd HH:mm:ss} - Start\r\n", DateTime.Now);
// still have to add an extra parameter
sb.AppendFormat("The current time is {0:yyyy-MM-dd HH:mm:ss}{1}", DateTime.Now,
Environment.NewLine);
StringWriter sw = new StringWriter();
// Don't have to worry about it, method name tells you there's a line break
sw.WriteLine("{0:yyyy-MM-dd HH:mm:ss} - Start", DateTime.Now);
// no extra parameters
sw.WriteLine("The current time is {0:yyyy-MM-dd HH:mm:ss}", DateTime.Now);
Скажем, вы хотите обрабатывать файл построчно, возможно, вы бы использовали StreamReader вместо загрузки всего файла в StringBuilder и разделения его на символы новой строки в массиве, верно? С помощью StringReader вы можете использовать точно такой же метод (если он требует универсального TextReader), создав StringReader из строки из TextBox или веб-формы.
Linq2Sql DataContexts имеет свойство Log, которое вы можете установить для TextWriter, чтобы ваши запросы выводились до того, как они будут выполнены, чтобы точно увидеть, что выполняется. Вы можете установить это для TextWriter, прикрепленного к файлу, но вы можете прикрепить к нему StringWriter и выводить содержимое внизу веб-страницы при тестировании ...