ToString
使用法
いいえ、ToString
ここでは使用しないでください。
文字列の連結は、非文字列を自動的に文字列に変換します。つまり、2つのバリアントはほぼ同一です。
一方または両方のオペランドが文字列型の場合、事前定義された加算演算子は、オペランドの文字列表現を連結します。
ソース:C#言語仕様:加算演算子、MSDN。
一方、最初のもの(なしToString
):
- 書くのが短い
- 読むのが短い
- 保守が簡単で、次のとおりです。
- 文字列を連結するという著者の意図を正確に示しています。
だから、最初のものを好む。
フードの下
また興味深いのは、内部で何が起こるかを確認することです。確認する方法の1つは、LINQPad内でILコードを監視することです。このプログラム:
void Main()
{
var a = 3;
var b = " Hello";
var c = a + b;
Console.WriteLine(c);
}
次のILに変換されます。
IL_0001: ldc.i4.3
IL_0002: stloc.0 // a
IL_0003: ldstr " Hello"
IL_0008: stloc.1 // b
IL_0009: ldloc.0 // a
IL_000A: box System.Int32
IL_000F: ldloc.1 // b
IL_0010: call System.String.Concat
IL_0015: stloc.2 // c
IL_0016: ldloc.2 // c
IL_0017: call System.Console.WriteLine
あれSystem.String.Concat
?つまり、元のコードも同様に記述でき、まったく同じILに変換されます。
void Main()
{
var a = 3;
var b = " Hello";
var c = string.Concat(a, b); // This is the line which was changed.
Console.WriteLine(c);
}
のドキュメントstring.Concat(object[])
を読むと、次のことを学ぶことができます。
メソッドは、そのオブジェクトのパラメーターなしメソッドを呼び出すことにより、args内の各オブジェクトを連結ToString
します。区切り文字は追加されません。
これToString
は冗長であることを意味します。また:
String.Empty
配列内のnullオブジェクトの代わりに使用されます。
これは、オペランドの一部がヌルであるケースをうまく処理します(脚注1を参照)。
最後の例では、連結がに変換されましたがstring.Concat
、コンパイラーの最適化も強調する必要があります。
var a = "Hello " + "World";
に翻訳されます:
ldstr "Hello World"
stloc.0
一方:
var a = string.Concat("Hello ", "World");
に翻訳されます:
ldstr "Hello "
ldstr "World"
call System.String.Concat
stloc.0
その他の選択肢
もちろん、C#でオブジェクトの文字列表現を連結する他の方法があります。
StringBuilder
多くの連結操作を行う必要がある場合に使用され、作成される中間文字列の数を減らすのに役立ちます。StringBuilder
連結を使用するか通常の連結を使用するかを決定するのは簡単ではありません。プロファイラーを使用するか、Stack Overflowで関連する回答を検索します。
を使用StringBuilder
すると、コードの読み取りと保守が難しくなるという大きな欠点があります。あなたの質問のような単純なケースStringBuilder
では、コードの可読性に有害であるだけでなく、パフォーマンスの面でも役に立ちません。
string.Join
区切り文字を追加する必要がある場合に使用する必要があります。
明らかに、string.Join
文字列を連結するために空の区切り文字と共に使用しないでください。
string.Format
文字列の連結よりも文字列テンプレートが望ましい場合に使用できます。あなたがそれを好むかもしれないケースの1つは、kunthetによる答えで示唆されているように、メッセージがローカライズされるときです。
使用にstring.Format
はいくつかの欠点があり、あなたのような単純な場合には不向きです:
単純な「{0}」プレースホルダーでは、どのパラメーターがどこに行くのかが不明確なことがよくあります。誤ってパラメーターを逆にしたり、忘れたりすることがよくあります。幸いなことに、C#6ではこの問題を解決する文字列補間がついに導入されました。
ランタイムのパフォーマンスが低下する場合があります。もちろん、想定していないstring.Format
です常に遅くなります。パフォーマンスが重要な場合は、2つのアプローチを測定し、仮定ではなく実際の結果に基づいてどちらが速いかを判断します。
コードは書くのが少し長く、読むのが長く、維持するのが難しいですが、これは非常にマイナーであり、あまり気にする必要はありません。
¹オブジェクトの1つがである場合に違いが現れますnull
。がなければToString
、a null
は空の文字列に置き換えられます。ではToString
、a NullReferenceException
がスローされます。
a + "" + b + ""
または"" + a + b + ""
、それは問題ではありません:それは、すべての文字列の連結です。でa + b + ""
、それは問題ありません:a
とb
最初に追加されます。