Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net StringWriter或StringBuilder_.net_Stringbuilder_Stringwriter - Fatal编程技术网

.net StringWriter或StringBuilder

.net StringWriter或StringBuilder,.net,stringbuilder,stringwriter,.net,Stringbuilder,Stringwriter,StringWriter和StringBuilder之间有什么区别?我什么时候应该使用其中一个呢?A用于将文本写入文件内存,A用于以内存高效的方式将字符串附加在一起。StringBuilder用于批量字符串连接。据我所知,它对5个以上的字符串更有效,然后是string.Concat()。它还可以与特定格式(.AppendFormat())一起使用StringBuilder类基本上是一个可变字符串,一个用于构造不可变字符串的辅助类。StringWriter是在上面构建的,可以为字符串格式添加更多方

StringWriter
StringBuilder
之间有什么区别?我什么时候应该使用其中一个呢?

A用于将文本写入文件内存,A用于以内存高效的方式将字符串附加在一起。

StringBuilder
用于批量字符串连接。据我所知,它对5个以上的字符串更有效,然后是
string.Concat()
。它还可以与特定格式(
.AppendFormat()

一起使用
StringBuilder
类基本上是一个可变字符串,一个用于构造不可变字符串的辅助类。
StringWriter
是在上面构建的,可以为字符串格式添加更多方便的函数。

源于,它允许各种类编写文本,而无需考虑文本的去向。在
StringWriter
的情况下,输出正好进入内存。如果您正在调用一个需要
TextWriter
但只想在内存中建立结果的API,则可以使用此选项


本质上是一个缓冲区,它允许您对“逻辑字符串”执行多个操作(通常是附加操作),而无需每次创建新的字符串对象。您可以使用它在多个操作中构造一个字符串。

我认为现有的任何答案都不能真正回答这个问题。这两个类之间的实际关系就是一个例子

StringWriter
通过转发到存储在字段中的
StringBuilder
实例,实现其所有
Write…
方法。这不仅仅是一个内部细节,因为
StringWriter
有一个公共方法返回内部字符串生成器,还允许您传入现有的
StringBuilder

因此,
StringWriter
是一个适配器,它允许
StringBuilder
被预期使用
TextWriter
的代码用作目标。就基本行为而言,他们之间显然没有选择的余地。。。除非您可以测量转发呼叫的开销,否则在这种情况下,
StringWriter
稍微慢一点,但这似乎不太可能是显著的

那么,为什么他们不直接制作
StringBuilder
实现
TextWriter
?这是一个灰色区域,因为界面背后的意图不一定总是一目了然

TextWriter
几乎是一个可以接受字符流的接口。但它还有一个额外的缺点:一个叫做。这意味着
TextWriter
是一个接口,它接收字符流并将其转换为字节

这在
StringWriter
中是一个无用的痕迹,因为它不执行编码。报告说:

此属性对于某些必须使用标头的XML场景是必需的 写入时包含StringWriter使用的编码。这 允许XML代码使用任意StringWriter并生成 正确的XML头

但这是不对的,因为我们无法为
StringWriter
指定
Encoding
的值。该属性始终具有值
unicodeincoding
。因此,任何检查此属性以将XML头构建到其中的代码都会说
utf-16
。例如:

var stringWriter = new StringWriter();
using (var xmlWriter = XmlWriter.Create(stringWriter))
    xDocument.WriteTo(xmlWriter);
生成标题的:

<?xml version="1.0" encoding="utf-16"?>

如果您过去常常将XML字符串写入文件,该怎么办?默认情况下,您将拥有一个带有
utf-16
头的
utf-8
文件

在这种情况下,使用
StreamWriter
,并使用文件路径或
FileStream
,或者如果要检查数据,则使用
MemoryStream
等更安全。所有这些组合将确保字节编码和头生成由
StreamWriter
中相同的
encoding
值引导

Encoding
属性的目的是允许字符流生成器将有关编码的准确信息包含到字符流本身中(例如在XML示例中;其他示例包括电子邮件头等)

但通过引入
StringWriter
,内容生成和编码之间的联系被打破,因此这种自动机制停止工作,并可能变得容易出错

不过,如果您非常小心,那么
StringWriter
是一个有用的适配器,也就是说,您知道您的内容生成代码不应该依赖于
Encoding
属性的无意义值。但这种警告通常与适配器模式有关。让你把一个方形但几乎是圆形的钉子装进一个圆孔里,这通常是一种技巧。

在前面(好)答案的基础上,StringWriter实际上比StringBuilder多才多艺,提供了很多重载

例如:

var stringWriter = new StringWriter();
using (var xmlWriter = XmlWriter.Create(stringWriter))
    xDocument.WriteTo(xmlWriter);
而Stringbuilder只接受Appendline的字符串或不接受任何内容

StringBuilder sb = new StringBuilder();
sb.AppendLine("A string");
StringWriter可以直接采用字符串格式

StringWriter sw = new StringWriter();
sw.WriteLine("A formatted string {0}", DateTime.Now);
使用StringBuilder时必须执行此操作(或使用string.Format或$“”)


不做也不做,但仍然有区别

StringBuilder
StringReader
用于在不同情况下提高性能。
使用
StringBuilder
提高字符串操作的性能,例如串联、重复修改字符串

Random rnd = new Random();
StringBuilder sb = new StringBuilder();

// Generate 10 random numbers and store in sb.
for (int i = 0; i < 10; i++)
{
    sb.Append(rnd.Next().ToString("N5"));
}
Console.WriteLine("The original string:");
Console.WriteLine(sb.ToString());

// Decrease each number by one.
for (int ctr = 0; ctr < sb.Length; ctr++)
{
    if (Char.GetUnicodeCategory(sb[ctr]) == System.Globalization.UnicodeCategory.DecimalDigitNumber)
    {
        int number = (int)Char.GetNumericValue(sb[ctr]);
        number--;
        if (number < 0)
            number = 9;

        sb[ctr] = number.ToString()[0];
    }
}
Console.WriteLine("\nThe new string:");
Console.WriteLine(sb.ToString());

您的最后一段适用于StringBuilder,而不是StringWriter。嗯。。MSDN说“StringWriter类实现了一个将信息写入字符串的TextWriter”@SandRock参见第二段您可以创建一个派生的
StringWriter
类型,其中很少有@Jon Skeet不是最高分的问题。我不明白为什么有人会对这个答案投赞成票;OP的问题是关于using (StringReader sr = new StringReader("input.txt")) { // Loop over the lines in the string or txt file. int count = 0; string line; while((line = sr.ReadLine()) != null) { count++; Console.WriteLine("Line {0}: {1}", count, line); } }