ここでの回答はすべてをカバーしているとは思わないので、ここで少し追加したいと思います。
Console.WriteLine(string format, params object[] pars)
を呼び出しますstring.Format
。「+」は文字列連結を意味します。これは常にスタイルとは関係がないと思います。状況に応じて、2つのスタイルを混在させる傾向があります。
短い答え
あなたが直面している決定は文字列の割り当てに関係しています。私はそれを簡単にしようとします。
あなたが持っていると言う
string s = a + "foo" + b;
これを実行すると、次のように評価されます。
string tmp1 = a;
string tmp2 = "foo"
string tmp3 = concat(tmp1, tmp2);
string tmp4 = b;
string s = concat(tmp3, tmp4);
tmp
ここは実際にはローカル変数ではありませんが、JITの一時的なものです(ILスタックにプッシュされます)。スタックに文字列をプッシュする場合(ldstr
リテラルのIL など)、スタック上の文字列ポインターへの参照を配置します。
あなたが電話した瞬間 concat
両方の文字列を含む使用可能な文字列参照がないため、この参照問題になります。これは、.NETが新しいメモリブロックを割り当て、2つの文字列で埋める必要があることを意味します。これが問題である理由は、割り当てが比較的高価であるためです。
質問の変更点:concat
操作の数を減らすにはどうすればよいですか?
したがって、大まかな答えは次のとおりstring.Format
です。> 1連結の場合、 '+'は1連結でうまく機能します。マイクロパフォーマンスの最適化を行う必要がないstring.Format
場合は、一般的なケースで問題なく機能します。
文化についてのメモ
そして文化と呼ばれるものがあります...
string.Format
CultureInfo
フォーマットで使用できます。単純な演算子「+」は現在のカルチャを使用します。
これは、ファイル形式とf.exを記述している場合は特に重要です。double
文字列に「追加」する値。別のマシンでstring.Format
は、明示的にを使用しないと、別の文字列になる可能性がありますCultureInfo
。
F.ex. 「。」を変更するとどうなるかを検討してください。コンマ区切り値ファイルの書き込み中の「、」の場合...オランダ語では、小数点記号はコンマであるため、ユーザーは「おかしい」驚きを感じるだけかもしれません。
より詳細な回答
文字列の正確なサイズが事前にわからない場合は、このようなポリシーを使用して、使用するバッファーを全体的に割り当てることをお勧めします。最初にスラックスペースが埋められ、その後データがコピーされます。
成長とは、新しいメモリブロックを割り当て、古いデータを新しいバッファにコピーすることを意味します。その後、メモリの古いブロックを解放できます。この時点で最終的な結果が得られます。成長はコストのかかる操作です。
これを行う最も実用的な方法は、割り当て超過ポリシーを使用することです。最も一般的なポリシーは、バッファを2の累乗で割り当てることです。もちろん、それより少し賢くする必要があります(128文字が必要なことがすでにわかっている場合は、1、2、4、8から大きくしても意味がないため)。 )しかし、画像を取得します。このポリシーにより、上記で説明した高価な操作をあまり必要としないことが保証されます。
StringBuilder
基本的には、基になるバッファーを2の累乗で全体的に割り当てるクラスです。フードの下でstring.Format
使用StringBuilder
します。
これにより、overlocate-and-append(-multiple)(w / woカルチャ)または単なるallocate-and-appendの間の基本的なトレードオフが決定されます。
string.Format
複合フォーマット機能を使用せず(つまり、単純な{0}
)、ILを書き直して、かなり高速な文字列連結に置き換えることができるコンパイル後のツールがあるのでしょうか。このような偉業は、PostSharpなどの既存のILリライターで実現できるのではないでしょうか。