とりわけ、 int privateCountとして宣言されたパラメーターを取る関数があります。このパラメーターで ToString() を呼び出したい場合、ReSharper はそれをグレー表示し、冗長呼び出しとしてマークします。好奇心旺盛なので、ToString() を削除しても、コードは引き続きビルドされます。
strが文字列の場合、C# コンパイラはこれをどのように許可できますか?
str += privateCount +
...
文字列の + 演算子はオーバーロードされ、式の左側と右側を渡して String.Concat を呼び出します。したがって:
string x = "123" + 45;
次のようにコンパイルされます。
String.Concat("123", 45);
String.Concat は 2 つのオブジェクトを受け取るため、右側 (45) がボックス化され、ToString() が呼び出されます。
この「オーバーロード」は、言語での演算子のオーバーロード (別名、op_Addition という名前のメソッドではない) によるものではなく、コンパイラによって処理されることに注意してください。
これは悪い習慣であるだけでなく、パフォーマンスも低下します。int.ToString() はボックス化を必要としないのに対し、String.Concat はオブジェクトを想定しているため、整数をボックス化する必要があります。
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);
コードから、これが整数ではなく文字列であることがわかります。