4

.Netプログラミングの初期の頃は、文字列を次のようにコンパイルするなど、複雑な文字列の連結にのみstring.Format()を使用していました。

2002年2月2日付けの顧客注文234と支払いID55543に問題があります。

しかし、今では、私がしなければならないほとんどすべての文字列連結にstring.Formatを使用しています。また、文字列の前に何かを付けるなどの単純なものも使用しています。

Console.WriteLine(string.Format("\t\t{0}", myString));

これにオーバーヘッドが発生する可能性はありますか?たぶん私は+これらの簡単な操作を行うために通常の演算子を使用する必要がありますか?

これについてどう思いますか?

4

7 に答える 7

5

単純な文字列連結の場合は、この+アプローチを使用します。フォーマットを必要としない単純なものの方が明確です。

特定の形式を持ち、文字列全体の構造を保持し、入力のプレースホルダーを提供することが役立つ、より複雑な文字列の場合は、を使用しますString.Format

そして、はい、オーバーヘッドがあります。String.Formatカバーの下にStringBuilderを使用します。これらのシナリオでは、単純な文字列の連結がはるかに高速になります。このトピックに関するいくつかのベンチマークとブログ投稿は、非常に簡単に見つけることができます。もちろん、それはすべてあなたの使用法に依存します。小さな文字列の連結がループで発生している場合、の繰り返しの使用は、単純な連結String.Formatよりも目立つ可能性があります。ループ内に大きな+文字列を構築している場合、典型的な例は優先することであり、concatとStringBuilderの関連する質問はSOにあります。StringBuilder

編集:明確にするために、これはほとんど目的を果たしません:String.Format("{0}{1}", a, b)多くのフォーマットがないので。それは単にa + bです。残念ながら、本番コードでそのような例に出くわしました。String.Formatを見るとすぐに、単純な連結ではなく、特定の方法で構造化する必要があるものが表示されると思います。

OTOH、この電話番号を検討してください:"(" + area + ") " + number + " x" + extension-あまりにも多くのことが起こっており、変更するのは簡単ではありません。この場合、String.Formatが望ましいです:String.Format("({0}) {1} x{2}", area, number, extension)。これはまだ些細な例ですが、あなたはその考えを理解します。

于 2010-03-19T15:13:28.903 に答える
2

単純な連結は、単純なものに対してより効率的です。String.Format()物事がより複雑になり、コードが読みやすくなる場合に使用します。

私は個人的に同じことをします(私が呼び出している関数が私のためにフォーマットを処理しない限り)。


クラリフィケーション

"Hello " + "World!";StringBuilderを使用するような通常の文字列連結の場合。あなたの例では、2つのタブを前に付けて、出力用に文字列をフォーマットしています...これはフォーマットに似ていると思います。

フォーマットと連結には違いがあります...何に使用するかに注意してください。


String.Format()StringBuilderを内部的に使用するため、とにかく通常の文字列連結を行うよりも連結の方が効率的です。

Console.WriteLine()フォーマット自体を処理できるため、例を変更することをお勧めします(String.Format()不要)。

Console.WriteLine("\t\t{0}", myString);

于 2010-03-19T15:12:25.753 に答える
2

また、文字列を使用する傾向があります。2つ以上の文字列/値を組み合わせる必要があるほとんどの操作では、+が中央にある文字列を開始および停止するよりもコードが読みやすくなるためです。

拡大するために

string value = string.Format("Hello {0}", user.username);

よりもはるかに読みやすく、拡張可能です

string value = "Hello" + user.username

たとえば、最終ログイン日をシステムアップグレードとして追加する場合は、コードを次のように展開するだけです。

string value = string.Format("Hello {0}, you last logged in {1}", user.username, user.lastLogin);
于 2010-03-19T15:14:44.663 に答える
1

私のルールは、+(連結)を複数回使用する必要がある場合、それをに変更することstring.Formatです。

string a = "Something: " + x;   // ok

string b = "Something: " + x + " something else"; // change it to a string.Format
string bB = string.Format("Something: {0} something else", x); // much nicer to read

string c = "Something: " + x + " " + y + " " + z;  // Yuck
string cC = string.Format("Something: {0} {1} {2}", x, y, x);  // Much nicer
于 2010-03-19T15:19:19.950 に答える
0

特定の文字列のプレフィックスまたはサフィックスが必要な場合String.Concatの代わりに使用する傾向があります。メソッドをString.Format明示的に呼び出してから演算子を使用することをお勧めします。すでに使用している場合は、1つのキーストロークを切り替えるだけです。Concat+String.Format

IIRCの場合、String.Concat方法は演算子を使用する場合と同じであるため、よりも高速ですString.Format

于 2010-03-19T15:17:10.507 に答える
0

パフォーマンスについてはわかりません。誰かがそのデータを提供する可能性がありますが、構成ファイル(またはデータベースフィールドやリソースファイルなど)にフォーマット文字列を入れたい場合は、String.Formatが最適だと思います。 。そうすれば、タブの数を微調整したり、スペースに切り替えたり、区切り文字を追加したりする場合など、再コンパイルする必要はありません。

于 2010-03-19T15:13:35.797 に答える
0

静的文字列メソッドの代わりに拡張メソッドを使用しますが、ほとんどの場合、フォーマットを使用します。理解しやすく、変更しやすく、一般的に保守しやすいと思います。また、連結のように順序の問題が発生しないため、ローカリゼーションが容易になります。

正直なところ、どちらが良く見えますか?

"You have {0} widgets.".Frmt(widgetCount)
"You have " + widgetCount.ToString() + " widgets."
于 2010-03-19T15:49:12.797 に答える