2017-10-12 13 views
-1

私はStringBuilderの関数が正しく動作する仕組みを説明する記事を探していました。C#StringBuilderはどのように変更可能ですか?

私は今、このanswer.

を通じて全体で得た、文字列は不変です。私はこれを得る。

しかし、StringBuilderは何かを追加しようとすると、新しい一時文字配列も初期化します。

+0

[here](https://github.com/Microsoft/referencesource/blob/master/mscorlib/system/text/stringbuilder.cs)のコードを読むことができます。ストーリーは短いです:StringBuilderはchar配列によってサポートされています。 – john

+0

[stringは不変で、stringbuilderは変更可能です](https://stackoverflow.com/questions/665499/string-is-immutable-and-stringbuilder-is-mutable) –

+0

これらは2つの異なるオブジェクトです。文字列は不変です。 StringBuilderはそうではありません。 StringBuilderがStringで始まるという事実は、必ずしもそれが不変でなければならないということを意味しません。 :) – user1506104

答えて

1

変更が新しいものを作成できないことを意味するものではありません。変更可能なことは、コンストラクタが復帰した後にその状態が変更できることを意味します。

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が変更可能であるという確かな証明です。

+0

また、StringBuilderが変更可能な理由についても言及することができます。Stringオブジェクトは不変です。 Stringクラスのメソッドのいずれかを使用するたびに、メモリ内に新しい文字列オブジェクトを作成します。新しい文字列オブジェクトには、その新しいオブジェクトの新しい領域割り当てが必要です。文字列を繰り返し変更する必要がある状況では、新しいStringオブジェクトの作成に伴うオーバーヘッドが高価になる可能性があります。 StringBuilderクラスは、新しいオブジェクトを作成せずに文字列を変更する場合に使用できます。 https://docs.microsoft.com/en-us/dotnet/standard/base-types/stringbuilder – Isma

-1

*Builderパターンは、コンストラクタ内のデータを単に渡すよりも豊富なインターフェイスを使用して、オブジェクト、特に不変オブジェクトを作成するための一般的なパターンです。それは、実際のデータは、最終的にあなたを入力する必要はありませんので、クラスXとクラスXBuilderとの関係は、通常はそれだけで一時的だ、XBuilderは不変である必要はありませんX.を構築することができます不変XXBuilderになりますXを構築する足場。

つまり、StringBuilderstringの可変バージョンではありません。これは、不変のstringを作成するのに役立つクラスの機能単位です。 StringBuilderをインスタンス化し、そのさまざまなAppendメソッドを使用して最終的な文字列を定義します(論理的には存在しません)。その後、完了したらmyStringBuilder.ToString()を呼び出します(これは、 BuildString()と呼ばれています)を使用して、実際に必要な文字列を取得します。

関連する問題