Вопрос

У меня есть функция, которая принимает, среди прочего, параметр, объявленный как 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);

Из кода мы знаем, что это строка, а не целое число.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top