查看string
类元数据,我只看到运算符==
和!=
重载。那么如何为' +
'运算符执行级联呢?
编辑:
Eric Lippert关于字符串连接的一些有趣的注释:
第2部分还提到了Joel的一篇超级文章(http://www.joelonsoftware.com/articles/fog0000000319.html)
查看string
类元数据,我只看到运算符==
和!=
重载。那么如何为' +
'运算符执行级联呢?
编辑:
Eric Lippert关于字符串连接的一些有趣的注释:
第2部分还提到了Joel的一篇超级文章(http://www.joelonsoftware.com/articles/fog0000000319.html)
Answers:
它不是-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);
(Gah-干预编辑意外删除了其他位。)
C#编译器注意到这里有多个字符串串联的好处是,您不必最终创建一个中间字符串x + y
,然后将其作为(x + y)
and串联的一部分再次复制z
。相反,我们一次性完成了所有工作。
编辑:请注意,如果您在循环中串联,编译器将无法执行任何操作。例如,此代码:
string x = "";
foreach (string y in strings)
{
x += y;
}
最终等同于:
string x = "";
foreach (string y in strings)
{
x = string.Concat(x, y);
}
...因此确实会产生大量垃圾,这就是为什么StringBuilder
在这种情况下应使用a的原因。我有一篇文章将详细介绍这两者,希望能回答更多问题。
string.Concat
和string.Join
方法有许多重载,包括某些IEnumerable<>
实例的重载。因此,在大多数情况下使用它们比使用a更方便StringBuilder
(我不知道这些方法是否在StringBuilder
内部使用,我只是说它们在大多数情况下更方便)。