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

sid*_*her 86 .net c# string

查看string类元数据,我只看到运算符==!=重载.那么它如何能够为' +'运算符执行连接?

编辑:

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

第1部分

第2部分

Joel还提到了第2部分中提到的超级文章(http://www.joelonsoftware.com/articles/fog0000000319.html)

Jon*_*eet 143

它没有 - C#编译器做:)

所以这段代码:

string x = "hello";
string y = "there";
string z = "chaps";
string all = x + y + z;
Run Code Online (Sandbox Code Playgroud)

实际上编译为:

string x = "hello";
string y = "there";
string z = "chaps";
string all = string.Concat(x, y, z);
Run Code Online (Sandbox Code Playgroud)

(Gah - 介入编辑意外删除了其他部分.)

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

编辑:请注意,如果在循环中连接,编译器将无法执行任何操作.例如,这段代码:

string x = "";
foreach (string y in strings)
{
    x += y;
}
Run Code Online (Sandbox Code Playgroud)

最终相当于:

string x = "";
foreach (string y in strings)
{
    x = string.Concat(x, y);
}
Run Code Online (Sandbox Code Playgroud)

...所以这确实会产生大量的垃圾,这就是为什么你应该使用一个StringBuilder这样的情况.我有一篇文章详细介绍了两者,希望能回答更多问题.

  • 好答案; 只是一个后续问题:如果你在循环中连接字符串,当编译器无法事先知道循环中会出现什么时,编译器如何工作.Concat操作符. (8认同)
  • @frenchie:这就是为什么最好使用StringBuilder进行*重复*连接...但是为什么它不值得连接*固定数量的值*. (4认同)
  • 但请注意,现在`string.Concat`和`string.Join`方法有很多重载,包括一些接受`IEnumerable <>`实例.因此,在大多数情况下使用它们比使用`StringBuilder`更方便(我不知道这些方法是否在内部使用`StringBuilder`,我只是说它们在大多数情况下更方便). (2认同)