私はStringBuilderの関数が正しく動作する仕組みを説明する記事を探していました。C#StringBuilderはどのように変更可能ですか?
私は今、このanswer.
を通じて全体で得た、文字列は不変です。私はこれを得る。
しかし、StringBuilderは何かを追加しようとすると、新しい一時文字配列も初期化します。
私はStringBuilderの関数が正しく動作する仕組みを説明する記事を探していました。C#StringBuilderはどのように変更可能ですか?
私は今、このanswer.
を通じて全体で得た、文字列は不変です。私はこれを得る。
しかし、StringBuilderは何かを追加しようとすると、新しい一時文字配列も初期化します。
変更が新しいものを作成できないことを意味するものではありません。変更可能なことは、コンストラクタが復帰した後にその状態が変更できることを意味します。
class Foo {
public string Bar { get; set; }
public void FooMethod() {
Bar = new string('!', 10);
}
}
我々はBar
の設定やFooMethod
を呼び出すことによって、その状態を変化させることができるので:
例えば、これはstring
は不変であっても、変更可能である
someFoo.FooMethod();
はい、私はFooMethod
に新しいstring
が作成されますが、これは問題ではありません。問題は何ですか、Bar
には新しい価値があります! someFoo
の状態が変更されました。
StringBuilder
は、状態が変更される可能性があるため、新しいStringBuilder
を作成せずに変更可能です。あなたが調べたように、StringBuilder
は文字配列を格納します。あなたが何かを追加するたびに、その文字配列は何かに変更されますが、新しいStringBuilder
は作成されません。これは、StringBuilder
が変更可能であるという確かな証明です。
また、StringBuilderが変更可能な理由についても言及することができます。Stringオブジェクトは不変です。 Stringクラスのメソッドのいずれかを使用するたびに、メモリ内に新しい文字列オブジェクトを作成します。新しい文字列オブジェクトには、その新しいオブジェクトの新しい領域割り当てが必要です。文字列を繰り返し変更する必要がある状況では、新しいStringオブジェクトの作成に伴うオーバーヘッドが高価になる可能性があります。 StringBuilderクラスは、新しいオブジェクトを作成せずに文字列を変更する場合に使用できます。 https://docs.microsoft.com/en-us/dotnet/standard/base-types/stringbuilder – Isma
*Builder
パターンは、コンストラクタ内のデータを単に渡すよりも豊富なインターフェイスを使用して、オブジェクト、特に不変オブジェクトを作成するための一般的なパターンです。それは、実際のデータは、最終的にあなたを入力する必要はありませんので、クラスX
とクラスXBuilder
との関係は、通常はそれだけで一時的だ、XBuilder
は不変である必要はありませんX.を構築することができます不変X
とXBuilder
になりますX
を構築する足場。
つまり、StringBuilder
はstring
の可変バージョンではありません。これは、不変のstring
を作成するのに役立つクラスの機能単位です。 StringBuilder
をインスタンス化し、そのさまざまなAppend
メソッドを使用して最終的な文字列を定義します(論理的には存在しません)。その後、完了したらmyStringBuilder.ToString()
を呼び出します(これは、 BuildString()
と呼ばれています)を使用して、実際に必要な文字列を取得します。
[here](https://github.com/Microsoft/referencesource/blob/master/mscorlib/system/text/stringbuilder.cs)のコードを読むことができます。ストーリーは短いです:StringBuilderはchar配列によってサポートされています。 – john
[stringは不変で、stringbuilderは変更可能です](https://stackoverflow.com/questions/665499/string-is-immutable-and-stringbuilder-is-mutable) –
これらは2つの異なるオブジェクトです。文字列は不変です。 StringBuilderはそうではありません。 StringBuilderがStringで始まるという事実は、必ずしもそれが不変でなければならないということを意味しません。 :) – user1506104