StringBuilder与StringWriter/StringReader

Sar*_*gam 31 .net c# stringbuilder stringreader c#-3.0

我最近读过它StringWriterStringReader用于写作和阅读StringBuilder.

好吧,当我使用StringBuilderObject时,它看起来是一个自给自足的类.

我们的阅读和写作的各种方式StringBuilder,使用 StringBuilder.Append(),Insert(),Replace(),Remove()等...

  1. 什么是可能的使用StringWriterStringReader,它StringBuilder本身不能完成?
  2. 它们的实际用途是什么?
  3. 可能的原因是它们没有Stream作为输入(因为任何其他编写器和读取器都将流作为Constructor参数进行操作)但是StringBuilder

Gre*_*ech 34

StringWriter和StringReader的可能用途是什么,StringBuilder本身无法做到这一点?

StringReaderStringWriter分别来自TextReaderTextWriter.所以他们可以做什么作为一个TextReader或一个TextWriter实例,哪个stringStringBuilder不可以,因为他们不会得到这些类型中的任何一个.

它们的实际用途是什么?

它们允许您调用期望a TextReader或的API TextWriter,当您拥有/想要的是string或时StringBuilder.

可能的原因是他们没有将Stream作为输入(因为任何其他编写器和读者都将流作为Constructor参数进行操作)但是StringBuilder?

因为他们不在溪流上工作; 他们在strings或StringBuilders 上工作.它们只是简单的包装类,它们适用于期望不同接口的API.请参阅:适配器模式.


Jas*_*aat 5

其他人已经说过了,但这是因为它们来自TextReader/TextWriter,可以代替它们使用.首先,如果您只想将内容作为字符串,则使用相同的方法输出用于文件的行更有意义.如果你想要在内存中跨越多行的输出,为什么还要记得用StringBuilder将"\ r \n"放在每一行的末尾?如果您希望代码运行或格式化仅使用"\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);
Run Code Online (Sandbox Code Playgroud)

假设您想逐行处理文件,您可能会使用StreamReader而不是将整个文件加载到StringBuilder中并将换行符分成数组,对吧?使用StringReader,您可以使用完全相同的方法(只要它采用通用的TextReader),方法是从TextBox或Web表单的字符串创建StringReader.

Linq2Sql DataContexts有一个Log属性,您可以将其设置为TextWriter,以便在执行查询之前输出查询,以准确查看正在运行的内容.您可以将其设置为附加到文件的TextWriter,但您可以将StringWriter附加到它,并在测试时输出网页底部的内容...