web-dev-qa-db-ja.com

変数を含むstring.formatとインライン変数

使用する長所/短所(ある場合)は何ですか

string output; 
int i = 10;
output = string.Format("the int is {0}", i);

versus

string output; 
int i = 10;
output = "the int is " + i;

私はいつも後者の例を使用してきましたが、オンラインチュートリアルの大部分がstring.formatの例を使用しているようです。効率に関して実際の違いはないと思います。私の最初の考えは、コーダーが変数を挿入するために文字列を分割し続ける必要がないようにすることです。

9
Jim

プロジェクトで翻訳が重要であると考える場合、最初の構文が実際に役立ちます。

たとえば、次のような場合があります。

static final string output_en = "{0} is {1} years old.";
static final string output_fr = "{0} a {1} ans.";

int age = 10;
string name = "Henri";
System.out.println(string.Format(output_en, name, age));
System.out.println(string.Format(output_fr, name, age));

また、変数が文の同じ場所にあるとは限らない場合があることに注意してください。

static final string output_yoda = "{1} years {0} has.";
22
Alex Garcia

https://stackoverflow.com/questions/4671610/why-use-string-format の最初の回答を確認してください。それはなぜそれがより良いのかに関する私の意見のすべてをカバーしています。

また、各.NETアセンブリには、一意の文字列のコレクションを含むインターンプールがあります。コードがコンパイルされると、コードで参照するすべての文字列リテラルがこのプールに追加されます。次のようなコードがある場合:

"the int is " + i + " and the double is " + d

これにより、プールで2つの文字列になります。

あなたが持っている場合:

"the int is {0} and the double is {1}"

プールにはストリングが1つだけあります。

文字列がインターンされるときとそうでないときを知るのは少し複雑です。ときどきインターンする必要がないかもしれない文字列を検出するときにコンパイラーがある程度のインテリジェンスを持っているためです...たとえば、チェックアウト この記事 =これにより、この問題についてより多くの洞察が得られます。

編集:少し掘り下げた後、私は質問への興味深い答えに遭遇しました String.Format対文字列連結を使用する方が良い場合はいつですか? 。要するに、+ 30票の回答の作成者は、ローカリゼーションが関与していない場合、文字列連結を支持する説得力のある議論をします。

8
Jalayn

出力時に文字列がどのように表示されるかを正確に確認できるため、最初の方法を使用します。スペースを追加するのを忘れたり、文字列を追加するだけの場合にスペースを追加したりするのは非常に簡単です。

追加の文字列を作成する必要がないため、最初の方法にはパフォーマンス上の利点もあると思います。しかし、それは私の主な関心事ではありません。

4
John Kraft

最初のオプションを使用することで、一般的に使用されるフォーマット文字列を保存し、必要な入力を減らすことができ、使用されるすべての場所で文字列を簡単に更新できます。基本的に、最初のオプションではDRYを簡単に実装できます。また、前述のように文字列で複数の変数を使用する必要がある場合は、より優れた構文です。

2
Ryathal

string.Format()を使用すると、正確に結果がどうなるかを確認しやすく(スペースを忘れた場合などに問題が発生しないように)、入力や変更も簡単になります。

非常に単純な書式設定を行う場合は、_+_ plus演算子を使用する方が簡単かもしれませんが、2つの文字列を連結する場合にのみ使用する傾向があります。

string.Format()の方が簡単に変更できることを示すために、例の文の最後に完全なストップを追加したいと考えてください。string.Format("The int is {0}", i)からstring.Format("The int is {0}.", i)への移動は単に一文字。しかし、_"the int is " + i_から_"the int is " + i + '.'_への移行ははるかに多くなります。

string.Format()のもう1つの利点は、string.Format("The int is 0x{0:X}.", i)のように、使用する形式を簡単に指定できることです。これは、日付をフォーマットするときにさらに重要です。

効率に関しては、string.Format()は単純な文字列の連結よりも遅い可能性が高いです。しかし、このようなコードはホットパス上にない可能性が高いため、問題ではありません。そしてもしそうなら、あなたはおそらくStringBuilderを使う方が良いでしょう。

1
svick

コードを最も読みやすくするものを使用してください。パフォーマンスについて心配する必要はありません。

以下の例では、Bの方が読みやすいので、Bを選択します。しかし、上記の言語翻訳も意味があります。誰かに強制的にstring.Formatを使用させないでください。代わりに、 The Sad Tragedy of Micro Optimizations Theater のJeff Atwoodsの優れたブログを読んでください。

A:

string output; 
int i = 10;
output = string.Format("the int is {0}", i);

versus

B:

string output; 
int i = 10;
output = "the int is " + i;
1
Makach