Избыточный вызов Object.ToString()
Вопрос
У меня есть функция, которая принимает, среди прочего, параметр, объявленный как int PrivateCount.Когда я хочу вызвать ToString() для этого параметра, ReSharper выделяет его серым цветом и помечает как избыточный вызов.Итак, как бы мне ни было любопытно, я удалил ToString(), а код все равно компилируется!
Как компилятор C# может это позволить, где ул. это строка?
str += privateCount +
...
Решение
Оператор + для строки перегружен для вызова String.Concat, передавая левую и правую часть выражения.Таким образом:
string x = "123" + 45;
Компилируется в:
String.Concat("123", 45);
Поскольку String.Concat принимает два объекта, правая часть (45) помещается в рамку, а затем для нее вызывается ToString().
Обратите внимание, что эта «перегрузка» происходит не через перегрузку операторов в языке (то есть, это не метод с именем op_Addition), а обрабатывается компилятором.
Другие советы
Это не только плохая практика, но и менее производительная:Целое число должно быть упаковано, поскольку String.Concat ожидает объект, а int.ToString() не требует упаковки.
C# автоматически преобразует объекты в строки.Рассмотрим эту строку кода:
aString = aString + 23;
Это допустимый C#;он компилируется в вызов String.Concat(), который принимает два объекта в качестве аргументов.Эти объекты автоматически преобразуются для вас в строковые объекты.
То же самое происходит, когда вы пишете:
aString += 23;
Опять же, это компилируется в тот же вызов String.Concat();просто написано по-другому.
Это действительно плохая практика, так как вам придется дважды подумать, является ли переменная строкой или целым числом.Что, если переменная будет называться myInt?
myInt = myInt + 23;
в таком виде более читабельно и понятно?
myInt = mInt + "23";
или даже:
myInt = string.Format("{0}{1}", myInt, 23);
Из кода мы знаем, что это строка, а не целое число.