String.Format vs “string” + “string” or StringBuilder?[重複]
-
06-09-2019 - |
質問
重複の可能性:
String.Format は StringBuilder と同じくらい効率的ですか
C# 文字列出力:フォーマットか連結か?
パフォーマンスの優先順位は何ですか。また、次のそれぞれを優先するための条件は何ですか。
String.Format("{0}, {1}", city, state);
または
city + ", " + state;
または
StringBuilder sb = new StringBuilder();
sb.Append(city);
sb.Append(", ");
sb.Append(state);
sb.ToString();
解決
- コンパイラは可能な限り文字列連結を最適化するため、たとえば、改行目的で分割されただけの文字列は、通常、単一の文字列リテラルに最適化できます。
- 変数との連結は String.Concat にコンパイルされます
- StringBuilder は、文字列に対して複数 (おそらく 10 回以上) の「変更」を行う場合にははるかに高速になりますが、必要以上のスペースをバッファーに割り当て、内部バッファーのサイズを変更するため、余分なオーバーヘッドが発生します。そうする必要がある。
私は個人的に、次の 2 つの理由から、ほぼ常に String.Format を使用します。
- 大量の変数を再配置するよりも、フォーマット文字列を維持する方がはるかに簡単です。
- String.Format は、文字列 (数値など) に埋め込まれた IFormattable 型に渡される IFormatProvider を受け取ります。これにより、指定されたカルチャに適切な数値書式設定が得られ、値の書式設定方法を全体的により詳細に制御できるようになります。
たとえば、一部のカルチャでは小数点としてカンマが使用されるため、意図したとおりに数値が書式設定されるようにするには、StringBuilder または String.Format で CultureInfo.InvariantCulture を指定する必要があります。
あと2つ注意点があります...
- StringBuilder には、不要な 2 番目のバッファーを必要とせずに String.Format の柔軟性を提供する AppendFormat 関数もあります。
- StringBuilder を使用する場合は、Append に渡すパラメーターを連結することで目的を果たさないように注意してください。見逃しやすいものです。
他のヒント
該当diferenceはありません。しかし、String.Formatのは、内部のStringBuilderを(あなたはリフレクターツールでそれを見ることができる)を使用すると仮定して、直接StringBuilder.Appendを使用すると、より高速である必要があります。
編集:それはあなたが連結されている各文字列を新しい文字列インスタンスが作成されますので、「+」演算子を使っもちろん、最悪の選択肢です。
。所属していません StackOverflow