2

Java 1.5以降では、プログラムのコンパイル時Stringにを使用するように連結が最適化されている場所を複数読んだことがあります。StringBuilderこれが標準なのか、それとも多くのコンパイラが採用している一般的な最適化なのかは私にはわかりません。これに関する説明をいただければ幸いですが、主に2番目の質問へのリードインです。

.NETも同様に最適化しますか?StringBuilderこれを使用するとあいまいさがなくなることは承知していますが、個人的+には読みやすいという単純さを感じています。.NETの場合、これは特定のバージョンで開始されましたか?精巧に感謝します。

4

5 に答える 5

4

MSDNから:

文字列オブジェクトの連結操作では、常に既存の文字列と新しいデータから新しいオブジェクトが作成されます。StringBuilderオブジェクトは、新しいデータの連結に対応するためのバッファーを維持します。空きがある場合は、新しいデータがバッファに追加されます。それ以外の場合は、新しい、より大きなバッファーが割り当てられ、元のバッファーからのデータが新しいバッファーにコピーされ、新しいデータが新しいバッファーに追加されます。

StringまたはStringBuilderオブジェクトの連結操作のパフォーマンスは、メモリ割り当ての頻度によって異なります。String連結操作は常にメモリを割り当てますが、StringBuilder連結操作は、StringBuilderオブジェクトバッファが小さすぎて新しいデータを収容できない場合にのみメモリを割り当てます。固定数のStringオブジェクトを連結する場合は、Stringクラスを使用します。その場合、コンパイラーは個々の連結操作を1つの操作に結合することもできます。任意の数の文字列を連結する場合は、StringBuilderオブジェクトを使用します。たとえば、ループを使用してランダムな数のユーザー入力の文字列を連結している場合です。

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

于 2012-07-05T19:29:16.157 に答える
1

これにより、StringBuilderに対してより良いビューが得られ、次に+を使用した文字列の連結が得られることを願っています。

パフォーマンスに関する考慮事項

文字列オブジェクトの連結操作では、常に既存の文字列と新しいデータから新しいオブジェクトが作成されます。StringBuilderオブジェクトは、新しいデータの連結に対応するためのバッファーを維持します。空きがある場合は、新しいデータがバッファに追加されます。それ以外の場合は、新しい、より大きなバッファーが割り当てられ、元のバッファーからのデータが新しいバッファーにコピーされ、新しいデータが新しいバッファーに追加されます。

StringまたはStringBuilderオブジェクトの連結操作のパフォーマンスは、メモリ割り当ての頻度によって異なります。String連結操作は常にメモリを割り当てますが、StringBuilder連結操作は、StringBuilderオブジェクトバッファが小さすぎて新しいデータを収容できない場合にのみメモリを割り当てます。固定数のStringオブジェクトを連結する場合は、Stringクラスを使用します。その場合、コンパイラーは個々の連結操作を1つの操作に結合することもできます。任意の数の文字列を連結する場合は、StringBuilderオブジェクトを使用します。たとえば、ループを使用してランダムな数のユーザー入力の文字列を連結している場合です。

MSDN

于 2012-07-05T19:33:07.670 に答える
0

いいえ、AFAIK.NETはこれを自動的に実行しません。具体的にする必要があります。文字列型は不変であるため、を使用+すると、新しい文字列が作成されるたびに作成されます。

たとえば、これを読むことをお勧めします。文字列を連結する最も効率的な方法は?

Hint-受け入れられた答えは必ずしも正しいものではないかもしれません。

そしてこれ:http ://en.csharp-online.net/Manipulating_Strings_in_CSharp%E2%80%94Concatenating_Strings

于 2012-07-05T19:27:20.587 に答える
0

いいえ、+演算子は.NETのStringBuilderでは最適化されていません。MSDNには、文字列操作を高速化したい場合はStringBuilderを使用できるなどの記述があります。

于 2012-07-05T19:29:09.143 に答える
0

1回の操作で複数の文字列を.netで連結するとString.Concat、.netはそれらの長さを合計し、適切なサイズの新しい文字列オブジェクトを作成し、すべての文字をソース文字列から新しい文字列にコピーします。呼び出しで4つ以下の文字列を実行している場合String.Concat、1つの新しいオブジェクト(新しい文字列)が作成されます。古い文字列の1つが破棄されてゴミにならない限り、「ゴミ」は作成されません。5つ以上の文字列を連結String[]すると、パラメータを保持するために新しい一時的な文字列が作成されますが、数千を渡さない限り、文字列の長さに関係なく、小さくて短命です(したがって比較的無害です)。パラメータの。

+さらに、 C#の演算子またはvb.netの+or演算子を使用して、任意の数の定数文字列を連結できます。コンパイラは、それらを1つの大きな定数文字列に変換します。&C#またはvb.netコンパイラが複数の定数文字列と非定数文字列を含む式の文字列を統合する範囲をどのルールが指定するかはわかりません(特に括弧が含まれている場合)。必要な数のパラメーターを使用してString.Concat呼び出しを使用+しますが、パラメーター内の定数文字列を統合するために使用すると、どのような場合でも最適なコードが生成されます。

于 2012-07-10T15:41:06.083 に答える