使用'+'运算符进行字符串连接

87
1个回答

145

它并不会影响 - 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。 我有一篇文章详细介绍了这两个方面的内容,希望能回答更多问题。


8
好的回答。我有一个跟进问题:如果您正在循环内拼接字符串,当编译器无法预先知道循环中会出现什么时,它如何处理 .Concat 运算符? - frenchie
啊,好的!这就是为什么在连接字符串时最好使用 StringBuilder 的原因? - frenchie
4
这就是为什么在重复连接时最好使用StringBuilder...但为什么对于连接固定数量的值来说不值得这样做。 - Jon Skeet
@初学者编程:不,int使用内置的IL指令。但是例如decimal会使用op_Add运算符实现。 - Jon Skeet
2
但请注意,现在的 string.Concatstring.Join 方法有许多重载,包括一些接受 IEnumerable<> 实例的方法。因此,在大多数情况下,它们比使用 StringBuilder 更方便(我不知道这些方法是否在内部使用 StringBuilder,我只是说它们在大多数情况下更方便)。 - Jeppe Stig Nielsen
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接