查看string个类元数据,我只看到操作符==!=重载.那么,它如何能够对"+"运算符执行串联呢?

Edit:

埃里克·利伯特(Eric Lippert)关于字符串连接的一些有趣的笔记:

Part 1

Part 2

第二部分(http://www.joelonsoftware.com/articles/fog0000000319.html)中还提到了乔尔的一篇超级文章

推荐答案

它没有——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)z串联的一部分.相反,我们一次就完成了这一切.

编辑:请注意,如果您在循环中连接,编译器can't会执行任何操作.例如,此代码:

string x = "";
foreach (string y in strings)
{
    x += y;
}

结果相当于:

string x = "";
foreach (string y in strings)
{
    x = string.Concat(x, y);
}

...所以这个does会产生很多垃圾,这就是为什么你应该在这种情况下使用StringBuilder.我有article going into more details about the two分,希望能回答更多的问题.

.net相关问答推荐

MSBuild:CopyToOutputDirectory不会将本机DLL复制到输出

Powershell机器令牌组

在数据网格中:如何在更改单元格 A 中的值后显示单元格 B 中的更改

cmd 冻结中的 dotnet 命令.怎么了?

如何为多种文件类型设置 FileSystemWatcher 过滤器?

C#字符串的GetHashCode()是如何实现的?

为什么这个多态 C# 代码会打印它的功能?

XmlNode 值与内部文本

Select 文件夹对话框 WPF

如何找到 ManualResetEvent 的状态?

如何在可取消的异步/等待中处理 TransactionScope?

如何使用配置转换删除 ConnectionString

.NET 的 String.Normalize 有什么作用?

C# - 你如何停止计时器?

Microsoft.Bcl.Build NuGet 包有什么作用?

使 HashSet 不区分大小写

合并两个(或更多)PDF

如何使用 NPOI 读取文件

如何修改 KeyValuePair 值?

如何重新启动我的 C# WinForm 应用程序?