String Concatenation using '+' operator
查看string类元数据,我只看到操作符==和!=过载。那么,它如何能够为"EDOCX1"(3)运算符执行连接呢?
编辑:
Eric Lippert关于字符串连接的一些有趣注释:
第1部分
第2部分
还有一篇来自Joel的超级文章在第2部分中提到(http://www.joelonsoftware.com/articles/fog000000319.html)
它没有-C编译器有:)
所以这个代码:
1 2 3 4
| string x ="hello";
string y ="there";
string z ="chaps";
string all = x + y + z; |
实际编译为:
1 2 3 4
| string x ="hello";
string y ="there";
string z ="chaps";
string all = string.Concat(x, y, z); |
(gah-中间编辑意外删除了其他位。)
C编译器注意到这里有多个字符串连接的好处是,您不会最终创建一个x + y的中间字符串,然后需要将其作为(x + y)和z连接的一部分再次复制。相反,我们一次就完成了。
编辑:请注意,如果在循环中连接,编译器就不能做任何事情。例如,此代码:
1 2 3 4 5
| string x ="";
foreach (string y in strings)
{
x += y;
} |
结果相当于:
1 2 3 4 5
| string x ="";
foreach (string y in strings)
{
x = string.Concat(x, y);
} |
…所以这确实会产生大量的垃圾,这就是为什么您应该对这种情况使用StringBuilder。我有一篇文章将详细介绍这两个问题,希望能回答更多的问题。
- 很好的答案;只是一个后续问题:如果您要在循环中连接字符串,那么当编译器不能提前知道循环中会发生什么时,它将如何处理.concat运算符。
- @弗朗奇:将为此进行编辑。
- 好吧!这就是为什么使用StringBuilder进行连接更好?
- @这就是为什么使用StringBuilder进行重复连接更好的原因…但为什么不值得将固定数量的值串联起来。
- @乔恩·斯基特:谢谢你的快速澄清……我也应该签入伊利诺伊州……这也是int加起来的方式吗?通过调用Add方法?
- StringBuilder是进行字符串连接的方法。+运算符会将整个字符串复制到另一个新变量,并导致和重载
- @当循环时,是的。不过,根据我的第一个示例,当在一个语句中连接多个表达式时,不是这样。注意,使用StringBuilder仍然需要复制整个字符串。
- @新手程序:不,int使用内置的IL指令。但是,例如,decimal将使用op_Add运算符实现。
- 但是请注意,现在string.Concat和string.Join方法有许多重载,包括一些使用IEnumerable<>的实例。因此,在大多数情况下,它们比使用StringBuilder更方便(我不知道这些方法是否在内部使用StringBuilder,我只是说它们在大多数情况下更方便)。
- 谢谢,这是工作