对Object.ToString()的冗余调用

时间:2020-03-05 18:56:32  来源:igfitidea点击:

我有一个函数,除其他外,该函数声明为int privateCount。当我想在此参数上调用ToString()时,ReSharper将其变灰并将其标记为冗余调用。因此,出于我的好奇,我删除了ToString(),并且代码仍在构建!

在str是字符串的情况下,Ccompiler如何允许此操作?

str + = privateCount +...

解决方案

回答

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

string x = "123" + 45;

编译为:

String.Concat("123", 45);

由于String.Concat接受两个对象,因此将右侧(45)装箱,然后在其上调用ToString()。

请注意,这种"重载"不是通过语言中的运算符重载(即,它不是名为op_Addition的方法)而是由编译器处理的。

回答

自动为我们将对象转换为字符串。考虑以下代码行:

aString = aString + 23;

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

当我们编写时,会发生相同的事情:

aString += 23;

同样,这将编译为对String.Concat()的同一调用。只是写的不同。

回答

这是一个有效的不良做法,因为如果变量是字符串还是整数,则必须三思。如果该变量称为myInt怎么办?

myInt = myInt + 23;

它以这种形式更易于阅读和理解吗?

myInt = mInt + "23";

甚至:

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

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

回答

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