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()
),以获得您想要的实际字符串。
我试图找出一个 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()
),以获得您想要的实际字符串。