2011-07-28 21 views
0

"固定長のStringオブジェクトが連結されている場合、連結操作にはStringクラスが適しています。この場合、個々の連結操作は、コンパイラ。固定数の.NET文字列連結

文字列の任意の数が連結されている場合はA StringBuilderオブジェクトは、連結演算のために好適である...でも 『かもしれない」私を取得します

http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx

シングは不明の言葉です』最初の段落で。それは "確かに"なるべきではありませんか?連結を1つの操作に組み合わせないと、Stringのメモリ割り当てが繰り返されるため、StringBuilderよりも絶対的に劣ってしまいます。

答えて

2

まあ、目立つ違いはありません。正直言って、彼らは些細な連結のためにばかばかしいでしょう:しかし、1つの操作で "n"文字列の直線連結のために、Concat(別名+)が輝きます。長さなどを効率的に計算し、コピーするだけです。ループでは、StringBuilderが輝きます。

とき、連結方式1つの操作中:

string s = a + b + c + x + y + z; 

本当にです:

string s = string.Concat(a, b, c, x, y, z); 

だけの余分な文字列です。

+0

変数やハードコードされたリテラルが使用されているかどうかは関係ありません。連結がコードの1行にある限り、それらは結合されますか? –

+0

@SValmont - one * expression *(1行ではない)、はい。 *リテラルまたは定数*が隣接している場合、コンパイラはビルド時に(実行時ではなく)それを行います。 –

+0

6つの引数を受け付けるConcat()のオーバーロードはありません。 –

0

コンパイル時に文字列の長さを判断できる場合、コンパイラはそれを自動的に効率的な表現にマージします。ただし、コンパイル時に長さを計算できない場合は、StringBuilderを使用する必要があります。

"かもしれません"というのは、不確定な長さの2つの文字列を連結するだけの場合は、文字列を使用するほうが速いことがあります。より多くの文字列が連結されるほど、StringBuilderの利点が増えます。

0

私の推測では、コンパイラがそれを1つに結合しないようにコードを書くことができます。しかし、マイクロソフトと同じようにコードを書くと、1回の操作でそれを実行する必要があります。