20

重複の可能性:
String.FormatはStringBuilder
C#文字列出力と同じくらい効率的ですか:formatまたはconcat?

パフォーマンスの優先順位と、次のそれぞれを優先する条件は何ですか。

String.Format("{0}, {1}", city, state);

また

city + ", " + state;

また

StringBuilder sb = new StringBuilder();
sb.Append(city);
sb.Append(", ");
sb.Append(state);
sb.ToString();
4

2 に答える 2

21
  • コンパイラはconcat可能な限り多くの文字列を最適化するため、たとえば、改行のために分割されたばかりの文字列は、通常、単一の文字列リテラルに最適化できます。
  • 変数との連結はにコンパイルされますString.Concat
  • StringBuilder文字列に複数の(10以上程度の)「変更」を行うと、はるかに高速になる可能性がありますが、バッファに必要なスペースよりも多くのスペースを割り当て、内部バッファのサイズを変更するため、余分なオーバーヘッドが発生します。する必要がある。

私は個人的にString.Formatほとんどの場合、次の2つの理由で使用しています。

  • 一連の変数を再配置するよりも、フォーマット文字列を維持する方がはるかに簡単です。
  • String.FormatIFormatProvider文字列に埋め込まれているすべての型(数値など)に渡されるaを取得して、指定されたカルチャIFormattableに適切な数値形式を取得し、全体的に値の形式をより細かく制御できるようにします。

たとえば、一部のカルチャでは小数点としてコンマを使用するため、どちらかで確認するか、数値が意図したとおりにフォーマットされていることを確認するかどうかStringBuilderString.Format指定します。CultureInfo.InvariantCulture

注意すべきもう2つのこと...

  • StringBuilderまた、不要なセカンドバッファを必要とせずAppendFormatに柔軟に対応できる機能を備えています。String.Format
  • を使用するときStringBuilderは、に渡すパラメーターを連結して目的を果たさないようにしてくださいAppend。見逃しやすいものです。
于 2009-05-28T03:39:51.890 に答える
1

関連する違いはありません。ただし、String.Formatが内部でStringBuilderを使用していると仮定すると(Reflectorツールで確認できます)、StringBuilder.Appendを直接使用する方が高速です。

編集:もちろん、「+」演算子を使用すると、連結する文字列ごとに新しい文字列インスタンスが作成されるため、最悪のオプションです。

于 2009-05-28T03:36:36.267 に答える