C# 使用'+';操作人员

C# 使用'+';操作人员,c#,.net,string,C#,.net,String,查看字符串类元数据,我只看到操作符==和=重载。那么,它如何能够为“+”操作符执行串联呢 编辑: Eric Lippert关于字符串连接的一些有趣注释: 还有一篇来自Joel的超级文章,在第2部分中提到了()它没有——C#编译器有:) 所以这个代码: string x = "hello"; string y = "there"; string z = "chaps"; string all = x + y + z; string x = ""; foreach (string y in s

查看
字符串
类元数据,我只看到操作符
==
=重载。那么,它如何能够为“
+
”操作符执行串联呢

编辑

Eric Lippert关于字符串连接的一些有趣注释:

还有一篇来自Joel的超级文章,在第2部分中提到了()

它没有——C#编译器有:)

所以这个代码:

string x = "hello";
string y = "there";
string z = "chaps";
string all = x + y + z;
string x = "";
foreach (string y in strings)
{
    x += y;
}
实际编译为:

string x = "hello";
string y = "there";
string z = "chaps";
string all = string.Concat(x, y, z);
(Gah-干预编辑意外删除了其他位。)

C#编译器注意到这里有多个字符串串联的好处是,您不会最终创建一个中间字符串
x+y
,然后需要再次复制该字符串作为
(x+y)
z
串联的一部分。相反,我们一次就完成了

编辑:请注意,如果在循环中串联,编译器将无法执行任何操作。例如,此代码:

string x = "hello";
string y = "there";
string z = "chaps";
string all = 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
。我有一个答案,希望能回答更多的问题。

回答得好;接下来的一个问题是:如果在循环中连接字符串,那么当编译器无法预先知道循环中将要发生什么时,.Concat操作符是如何工作的。啊,好的!这就是为什么使用StringBuilder进行连接更好的原因?@frenchie:这就是为什么使用StringBuilder进行重复连接更好的原因。。。但是为什么它不值得连接固定数量的值。@乔恩·斯凯特:谢谢你的快速澄清……我也应该签入IL。这就是int如何添加的?通过调用Add方法?但是请注意,现在的
string.Concat
string.Join
方法有很多重载,包括一些接受
IEnumerable
实例的重载。因此,在大多数情况下,它们比使用
StringBuilder
更方便(我不知道这些方法是否在内部使用
StringBuilder
,我只是说它们在大多数情况下更方便)。