私はと宣言されたパラメータをとり、int privateCountという関数を持っています。このパラメータでToString()を呼び出すとき、ReSharperはそれをグレー表示して冗長呼び出しとしてマークします。だから私が好きなのは、ToString()を削除しても、コードはまだビルドされています!Object.ToString()への冗長呼び出し
どのようにしてC#コンパイラはこれを許可できますか?strは文字列ですか?
str += privateCount +
...
私はと宣言されたパラメータをとり、int privateCountという関数を持っています。このパラメータでToString()を呼び出すとき、ReSharperはそれをグレー表示して冗長呼び出しとしてマークします。だから私が好きなのは、ToString()を削除しても、コードはまだビルドされています!Object.ToString()への冗長呼び出し
どのようにしてC#コンパイラはこれを許可できますか?strは文字列ですか?
str += privateCount +
...
文字列の+演算子はString.Concatは、式の左側と右側に渡して呼び出すようにオーバーロードされます。したがって:
string x = "123" + 45;
のにコンパイルさ:
String.Concat("123", 45);
String.Concat 2つのオブジェクトにかかるため、右側(45)が箱詰めされ、その後のToString()がその上に呼び出されます。
この「オーバーロード」は、言語の演算子オーバーロード(別名op_Additionというメソッドではありません)ではなく、コンパイラによって処理されることに注意してください。
C#は自動的にオブジェクトを文字列に変換します。このコード行を考えてみましょう:
aString = aString + 23;
これは有効なC#です。 2つのオブジェクトを引数として取るString.Concat()の呼び出しにコンパイルされます。これらのオブジェクトは自動的に文字列オブジェクトに変換されます。
あなたが書いたときに同じことが起こる:
aString += 23;
はやはり、これは)String.Concat(と同じ呼び出しまでコンパイルします。別の言葉で書かれています。
変数が文字列かintかを2度考えなければならないので、これは有効な悪い習慣です。変数がmyIntと呼ばれる場合はどうなりますか?
myInt = myInt + 23;
この形式では読みやすく理解できますか?
myInt = mInt + "23";
かさえ:
myInt = string.Format("{0}{1}", myInt, 23);
私たちは、それが文字列ではなく整数であることをコードから知っています。
int.ToString()はボクシングを必要としませんが、String.Concatはオブジェクトを必要とするため、整数にはボックス化する必要があります。
実際に性能差を測定しましたか? –
Jeffrey Richterは有名な本「CLR via C#」(135頁)に書いています。 –
しかし、これは疑問を投げかけます。それが悪い習慣であり、パフォーマンスが低い場合、なぜReSharperはそれを推奨しますか? – Rolf