11

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

C# 编译器如何允许这样做,其中str是一个字符串?

str += privateCount +...

4

4 回答 4

20

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

string x = "123" + 45;

编译为:

String.Concat("123", 45);

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

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

于 2008-09-16T16:54:38.617 回答
8

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

于 2008-09-16T18:23:50.290 回答
2

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

aString = aString + 23;

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

当您编写时会发生同样的事情:

aString += 23;

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

于 2008-09-16T16:59:38.790 回答
1

这是一种有效的不好的做法,因为如果变量是字符串或 int,您必须三思而后行。如果变量被称为 myInt 怎么办?

myInt = myInt + 23;

这种形式更具可读性和可理解性?

myInt = mInt + "23";

甚至:

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

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

于 2008-09-16T17:06:57.463 回答