查看 string
类元数据,我只看到了运算符 ==
和 !=
被重载。那么它是如何使用 '+
' 运算符执行字符串连接的?
编辑:
Eric Lippert 关于字符串连接的一些有趣的注释:
第二部分中还有 Joel 的一篇超级文章(http://www.joelonsoftware.com/articles/fog0000000319.html)
它并不会影响 - C# 编译器会处理它 :)
所以这段代码:
string x = "hello";
string y = "there";
string z = "chaps";
string all = x + y + z;
实际上被编译为:
string x = "hello";
string y = "there";
string z = "chaps";
string all = string.Concat(x, y, z);
(抱歉,误操作删除了其他部分。)
C#编译器注意到这里有多个字符串拼接的好处在于,不需要创建一个中间的字符串x + y
,然后再将其复制作为(x + y)
和z
的拼接的一部分。相反,我们可以一次性完成所有操作。
编辑:请注意,如果您在循环中进行拼接,编译器将无法执行任何操作。例如,以下代码:
string x = "";
foreach (string y in strings)
{
x += y;
}
最终就变成等价于:
string x = "";
foreach (string y in strings)
{
x = string.Concat(x, y);
}
...因此,这确实会产生大量垃圾,这就是为什么应该在这种情况下使用StringBuilder
。 我有一篇文章详细介绍了这两个方面的内容,希望能回答更多问题。
int
使用内置的IL指令。但是例如decimal
会使用op_Add
运算符实现。 - Jon Skeetstring.Concat
和string.Join
方法有许多重载,包括一些接受IEnumerable<>
实例的方法。因此,在大多数情况下,它们比使用StringBuilder
更方便(我不知道这些方法是否在内部使用StringBuilder
,我只是说它们在大多数情况下更方便)。 - Jeppe Stig Nielsen