タイトルが示すように、文字列の末尾に何かを追加するために次のことを行うべきではない理由はありますか?
string someString = "test";
someString += "Test";
タイトルが示すように、文字列の末尾に何かを追加するために次のことを行うべきではない理由はありますか?
string someString = "test";
someString += "Test";
一度やれば大したことない。2 つの文字列の内容が取得され、新しい文字列が作成されて に割り当てられsomeString
ます。上記の操作を何度も (ループなどで) 行うと、問題が発生します。実行ごとに、ヒープに新しいオブジェクト、新しい文字列インスタンスを割り当てています。StringBuilder
そのため、コンテンツを文字列に複数回追加する必要がある場合は、 などのバッファベースの型を使用することをお勧めします。
次の場合:
var s = "abc";
s += "def";
s += "ghi";
(多かれ少なかれ)何が起こるかというと、2行目で、新しい文字列が作成されるときに、の内容abc
がそこにコピーされ、次にの内容がそれにdef
コピーされ、この新しい文字列(abcdef
)がに割り当てられます。変数。
次に、3行目で、別の新しい文字列が作成され、変数(abcdef
)の前の値の内容がその文字列にコピーされghi
、次に、結果が変数に割り当てられます。
これを繰り返し行うと、文字列の先頭がすべての+=
操作で何度もコピーされていることがわかります。長い文字列を構築するループでは、これが影響を与える可能性があります。StringBuilder
これは、またはList<string>
を使用して最適化できるstring.Concat()
ため、最終結果のすべての部分を1回だけコピーします(またはループの反復回数に関係なく、他の定数をコピーします)。
あなたのアプローチはうまくいきます。代わりに StringBuilder を使用できます。
var sb = new StringBuilder();
sb.Append("Foo");
sb.Append(" - ");
sb.Append("Bar");
string someString = sb.ToString();