C#StringBuilder是如何可变的?

时间:2017-10-12 06:51:47

标签: c# string stringbuilder

我试图找出一篇文章,该文章应该解释为StringBuilder准确添加函数的方法。

我遇到了这个answer.

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

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

2 个答案:

答案 0 :(得分:1)

Mutable并不意味着它无法创造新东西。 Mutable只意味着它的状态可以在构造函数返回后改变。

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

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

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

因为我们可以通过设置Bar或致电FooMethod来更改其状态:

 someFoo.FooMethod();

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

我们说StringBuilder是可变的,因为它的状态可以改变,而不会创建新的StringBuilder。正如您查找的那样,StringBuilder存储了一个char数组。每次附加某些内容时,该char数组都会更改为其他内容,但不会创建新的StringBuilder。这是StringBuilder可变的可靠证据。

答案 1 :(得分:-1)

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

换句话说,X不是StringBuilder的可变版本。它是一个类,一个功能单元,用于帮助您创建不可变的string。您实例化string,使用其各种StringBuilder方法来定义最终字符串中的内容(逻辑上不存在),然后,当您完成时,调用{ {1}}(我认为应该称之为Append),以获取您想要的实际字符串。