Object.ToString() への冗長な呼び出し
質問
とりわけ、次のように宣言されたパラメーターを取る関数があります。 int privateCount. 。このパラメータで ToString() を呼び出したい場合、ReSharper はそれをグレー表示にし、冗長な呼び出しとしてマークします。そこで、私は好奇心が強いので、ToString() を削除しても、コードは引き続きビルドされます。
C# コンパイラはどのようにしてこれを許可できるのでしょうか。 str 文字列ですか?
str += privateCount +
...
解決
string の + 演算子は、式の左側と右側を渡す String.Concat を呼び出すためにオーバーロードされます。したがって:
string x = "123" + 45;
次のようにコンパイルされます。
String.Concat("123", 45);
String.Concat は 2 つのオブジェクトを受け取るため、右側 (45) がボックス化され、それに対して ToString() が呼び出されます。
この「オーバーロード」は、言語での演算子のオーバーロード (つまり、op_Addition という名前のメソッドではありません) によるものではなく、コンパイラーによって処理されることに注意してください。
他のヒント
これは悪い習慣であるだけでなく、パフォーマンスも低下します。String.Concat はオブジェクトを予期しますが、int.ToString() はボックス化を必要としないため、整数はボックス化する必要があります。
C# はオブジェクトを自動的に文字列に変換します。次のコード行を考えてみましょう。
aString = aString + 23;
これは有効な C# です。これは、2 つのオブジェクトを引数として受け取る String.Concat() の呼び出しにコンパイルされます。これらのオブジェクトは自動的に文字列オブジェクトに変換されます。
次のように書いた場合も同じことが起こります。
aString += 23;
繰り返しますが、これは String.Concat() への同じ呼び出しにコンパイルされます。書き方が違うだけです。
変数が文字列か整数かをよく考える必要があるため、これは有効な悪い習慣です。変数の名前が myInt だったらどうなるでしょうか?
myInt = myInt + 23;
この形式の方が読みやすく、理解しやすいでしょうか?
myInt = mInt + "23";
あるいは:
myInt = string.Format("{0}{1}", myInt, 23);
コードから、それが整数ではなく文字列であることがわかります。