2011-08-15 20 views
2

すべて、文字列string s = "abcd"についてはパフォーマンスの考慮 - C#

string w = s.SubString(2)リターン新しい割り当てられたStringオブジェクト、すなわち内部string w = new String ("cd")または文字列リテラルのでしょうか?

StringBuilderの場合、文字列値を追加する場合、StringBuilderのサイズを増やす必要がある場合、すべての内容が新しいメモリ位置にコピーされるか、以前の文字列値へのポインタが新しいロケーション?

答えて

5

Stringは不変であるため、文字列を「変更する」操作は実際にはnew stringを返します。これには、SubStringと、長さを変更しないもの(ToLower()など)を含むStringのすべての操作が含まれます。

StringBuilderには、内部で文字のチャンクのリンクリストが含まれています。成長が必要な場合は、新しいチャンクが割り当てられ、リストの最後に挿入され、ここにデータがコピーされます。つまり、StringBuilderバッファ全体がappendにコピーされることはなく、追加するデータだけがコピーされます。これをFramework 4の参照元に対して二重チェックしました。

+0

ご返信ありがとうございます。実際には、私の質問は、String.Substring()が 'new String(XXXX)'または '' XXXX "'だけを返した場合より多くのものでした。しかし、私の答えを得た –

+0

それは常に新しいオブジェクトになります。実際には(文字列定数や文字列が含まれていない限り)、 "new String(XXXX)"や "XXXX"を返すことの違いについて話すのはほとんど意味がありません。 – driis

+0

あなたが話しているリファレンスソースは? –

1

For the string string s = "abcd", does string w = s.SubString(2) return a new allocated String object?はい

For StringBuilder, when appending string values and if the size of the StringBuilder needs to be increased, are all the contents copied over to a new memory location?はい

新しいStringのString小規模または大規模な結果に何らかの変化

+0

実際には、より多くのスペースが必要な場合は、既存のコンテンツはすべて新しいバッファにコピーされません。 (これはFramework 4.0のリファレンスソースに対してチェックされています)。 – driis

+0

@driis:MSDNは、 'StringBuilderオブジェクトは、新しいデータの連結に対応するバッファを保持しています。空き容量がある場合、新しいデータがバッファの最後に追加されます。 **それ以外の場合は、新しいより大きいバッファが割り当てられ、元のバッファからのデータが新しいバッファにコピーされ、新しいデータが新しいバッファに追加されます**。これは、既存のすべてのデータがコピーされることを意味しません新しいバッファに? –

0

文字列は、作成、変更を行うために、あなたが持っていたので、すべての時間不変オブジェクトでありますその文字列の新しいインスタンスsubstringメソッドは元の文字列の値を変更しません。

よろしくお願いいたします。

+0

ご返信ありがとうございます。実際には、私の質問は、String.Substring()が 'new String(XXXX)'または '' XXXX "'だけを返した場合より多くのものでした。しかし、私の答えが得られました。 –

+0

はい、SubStringメソッドでも、ヒープ上に新しいオブジェクトがあります。これらは参照型であり、構造体などの変数などのジバール型ではありません。 –

0

文字列に多数の編集を行う場合は、StringBuilderを使用してこれを行う方がよいでしょう。 MSDNから

あなたは、StringBuilderクラスの代わりに、文字列の値に複数の変更を加える操作のためのStringクラスを使用することができます。 Stringクラスのインスタンスとは異なり、StringBuilderオブジェクトは変更可能です。文字列から部分文字列を連結、追加、または削除すると、操作は単一の文字列に対して実行されます。

関連する問題