gpt4 book ai didi

.net - StringWriter 或 StringBuilder

转载 作者:行者123 更新时间:2023-12-03 02:14:48 26 4
gpt4 key购买 nike

StringWriterStringBuilder 之间有什么区别?何时应该使用其中之一?

最佳答案

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

StringWriter 通过转发到存储在字段中的 StringBuilder 实例来实现其所有 Write... 方法。这不仅仅是一个内部细节,因为 StringWriter 有一个公共(public)方法 GetStringBuilder返回内部字符串生成器,以及 a constructor它允许您传入现有的 StringBuilder

因此,StringWriter 是一个适配器,允许希望与 TextWriter 一起使用的代码将 StringBuilder 用作目标。就基本行为而言,它们之间显然没有什么可选择的...除非您可以测量转发调用的开销,在这种情况下 StringWriter 稍微慢一些,但这似乎不太可能很重要.

那么为什么他们不让 StringBuilder 直接实现 TextWriter 呢?这是一个灰色地带,因为乍一看界面背后的意图并不一定总是很清楚。

TextWriter非常是一个接受字符流的接口(interface)。但它还有一个额外的问题:一个名为 Encoding 的属性。 。这意味着 TextWriter 是一个接受字符流并将其转换为字节的接口(interface)。

这是 StringWriter 中无用的痕迹,因为它不执行编码。 documentation说:

This property is necessary for some XML scenarios where a header must be written containing the encoding used by the StringWriter. This allows the XML code to consume an arbitrary StringWriter and generate the correct XML header.

但这不可能是正确的,因为我们无法为StringWriter指定Encoding的值。该属性始终具有值 UnicodeEncoding。因此,任何检查此属性以构建 XML header 的代码都将始终显示 utf-16。例如:

var stringWriter = new StringWriter();
using (var xmlWriter = XmlWriter.Create(stringWriter))
xDocument.WriteTo(xmlWriter);

生成标题:

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

如果你使用 File.WriteAllText 会怎么样?将 XML 字符串写入文件?默认情况下,您将拥有一个带有 utf-16 header 的 utf-8 文件。

在这种情况下,使用 StreamWriter 会更安全,并使用文件路径或 FileStream 构造它,或者如果您想检查数据,则使用MemoryStream 等等 obtain an array of bytes 。所有这些组合将确保字节编码和 header 生成由 StreamWriter 中相同的 Encoding 值引导。

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

但是通过引入 StringWriter,内容生成和编码之间的链接被破坏,因此此类自动机制将停止工作并可能容易出错。

尽管如此,如果您小心的话,StringWriter 是一个有用的适配器,即您了解内容生成代码不应依赖于 Encoding 属性的无意义值。但这种警告通常与适配器模式相关。这通常是一种允许您将方形但几乎圆形的钉子安装到圆孔中的技巧。

关于.net - StringWriter 或 StringBuilder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/602279/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com