C# 对Object.ToString()的冗余调用

C# 对Object.ToString()的冗余调用,c#,.net,resharper,C#,.net,Resharper,我有一个函数,其中包括一个声明为int privateCount的参数。当我想在此参数上调用ToString()时,ReSharper会将其灰显,并将其标记为冗余调用。因此,尽管我很好奇,但我删除了ToString(),代码仍然在生成 如果str是一个字符串,C#编译器如何允许这种情况 str+=privateCount+..字符串的+运算符重载为调用字符串。Concat在表达式的左侧和右侧传递。因此: string x = "123" + 45; 编译为: String.Concat("12

我有一个函数,其中包括一个声明为int privateCount的参数。当我想在此参数上调用ToString()时,ReSharper会将其灰显,并将其标记为冗余调用。因此,尽管我很好奇,但我删除了ToString(),代码仍然在生成

如果str是一个字符串,C#编译器如何允许这种情况


str+=privateCount+
..

字符串的+运算符重载为调用字符串。Concat在表达式的左侧和右侧传递。因此:

string x = "123" + 45;
编译为:

String.Concat("123", 45);
由于String.Concat接受两个对象,因此右侧(45)被装箱,然后对其调用ToString()

请注意,这种“重载”不是通过语言中的运算符重载实现的(也就是说,它不是名为op_Addition的方法),而是由编译器处理的。

C#自动将对象转换为字符串。考虑这行代码:

aString = aString + 23;
这是有效的C#;它编译为对String.Concat()的调用,该调用将两个对象作为参数。这些对象将自动转换为字符串对象

同样的事情也发生在你写的时候:

aString += 23;

同样,这将编译为对String.Concat()的相同调用;它只是写得不同而已。

这是一种有效的错误做法,因为如果变量是字符串或int,您必须三思。如果变量将被称为myInt呢

myInt = myInt + 23;
这种形式更容易阅读和理解

myInt = mInt + "23";
甚至:

myInt = string.Format("{0}{1}", myInt, 23);

我们从代码中知道它是一个字符串而不是一个整数。

这不仅是一种不好的做法,而且性能也较差:必须对整数进行装箱,因为string.Concat需要一个对象,而int.ToString()不需要装箱。

Jeffrey Richter在他的著名著作《CLR via C#》(第135f页)中写到了这一点。但这提出了一问题。如果这是一种不好的做法,性能较差,为什么ReSharper会推荐它?