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
,我只是说它们在大多数情况下更方便)。