あなたの質問に答えるには:
C#(および一般的に.NET)での文字列連結は「安全」ですが、説明したようにタイトループで実行すると、深刻なメモリ負荷が発生し、ガベージコレクターに負担がかかる可能性があります。
おっしゃっているエラーは、何らかのリソースの枯渇に関連していると推測できますが、より詳細な情報を提供していただけると助かります。たとえば、例外が発生しましたか? アプリケーションが異常終了しましたか?
背景:
.NET 文字列は不変であるため、次のように連結すると:
var stringList = new List<string> {"aaa", "bbb", "ccc", "ddd", //... };
string result = String.Empty;
foreach (var s in stringList)
{
result = result + s;
}
これは、次のものとほぼ同等です。
string result = "";
result = "aaa"
string temp1 = result + "bbb";
result = temp1;
string temp2 = temp1 + "ccc";
result = temp2;
string temp3 = temp2 + "ddd";
result = temp3;
// ...
result = tempN + x;
この例の目的は、ループのたびに新しい一時文字列が割り当てられることを強調することです。
文字列は不変であるため、ランタイムには代替オプションがありませんが、結果の末尾に別の文字列を追加するたびに新しい文字列を割り当てるしかありません。
文字列は最新かつ最大の中間結果を指すように常に更新されますが、result
これらの名前のない一時的な文字列が大量に生成され、ほとんどすぐにガベージ コレクションの対象になります。
この連結の最後に、次の文字列がメモリに格納されます (簡単にするために、ガベージ コレクターがまだ実行されていないと仮定します)。
string a = "aaa";
string b = "bbb";
string c = "ccc";
// ...
string temp1 = "aaabbb";
string temp2 = "aaabbbccc";
string temp3 = "aaabbbcccddd";
string temp4 = "aaabbbcccdddeee";
string temp5 = "aaabbbcccdddeeefff";
string temp6 = "aaabbbcccdddeeefffggg";
// ...
これらの暗黙的な一時変数はすべて、ほぼ即時にガベージ コレクションの対象となりますが、それでも割り当てが必要です。タイトなループで連結を実行すると、ガベージ コレクターに大きな負荷がかかり、コードの実行が非常に遅くなります。この最初の手によるパフォーマンスへの影響を見てきましたが、連結された文字列が大きくなるにつれて、それは本当に劇的になります。
StringBuilder
複数の文字列連結を行う場合は、常に a を使用することをお勧めします。 StringBuilder
変更可能なバッファを使用して、文字列を構築するために必要な割り当ての数を減らします。