C# StringBuilder 是如何可变的?

C# How StringBuilder is mutable?

我试图找出一个 post 来解释 StringBuilder 的 append 函数是如何工作的。

我通过了这个answer.

现在,String 是不可变的。我明白了。

但是,每当我们尝试向其追加内容时,StringBuilder 也会初始化一个新的临时字符数组。

可变并不意味着它不能创造新的东西。可变只是意味着它的状态可以在构造函数之后改变 returns.

例如,这是可变的,即使 string 是不可变的:

class Foo {
    public string Bar { get; set; }

    public void FooMethod() {
        Bar = new string('!', 10);
    }
}

因为我们可以通过设置Bar或调用FooMethod:

来改变它的状态
 someFoo.FooMethod();

是的,我正在 FooMethod 中创建一个新的 string,但这并不重要。重要的是 Bar 现在有了新的价值! someFoo 的状态改变了。

我们说 StringBuilder 是可变的,因为它的状态可以改变,而无需创建新的 StringBuilder。如您所见,StringBuilder 存储一个字符数组。每次附加内容时,该 char 数组都会更改为其他内容,但不会创建新的 StringBuilder。这是 StringBuilder 可变的有力证据。

*Builder模式是创建对象的常用模式,尤其是不可变对象,使用更丰富的接口,而不是简单地在构造函数中传入一堆数据。 class X 和 class XBuilder 之间的关系通常是不可变的 X 和可以 构建的 XBuilder 一个 X. XBuilder 不需要是不可变的,因为它不是你最终需要的实际数据类型,它只是构建 X.

的临时脚手架

换句话说,StringBuilder 不是 string 的可变版本。它是一个 class,一个功能单元,可以帮助您创建一个不可变的 string。您实例化一个 StringBuilder,使用它的各种 Append 方法来定义最终字符串中应该包含的内容(从逻辑上讲,它还不存在),然后,当您完成后,调用 myStringBuilder.ToString()(我认为应该称为 BuildString()),以获得您想要的实际字符串。