【问题标题】:String Concatenation using '+' operator使用“+”运算符的字符串连接
【发布时间】:2012-05-07 15:27:47
【问题描述】:

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

编辑

Eric Lippert 关于字符串连接的一些有趣笔记:

Part 1

Part 2

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

【问题讨论】:

    标签: c# .net string


    【解决方案1】:

    它没有 - 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。相反,我们一口气完成了所有工作。

    编辑:请注意,如果您在循环中连接,编译器 无法 做任何事情。例如这段代码:

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

    最终等同于:

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

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

    【讨论】:

    • 好答案;只是一个后续问题:如果您在循环中连接字符串,编译器如何在无法提前知道循环中的内容时使用 .Concat 运算符。
    • 啊,好吧!这就是为什么最好使用 StringBuilder 进行连接?
    • @frenchie:这就是为什么最好使用 StringBuilder 进行 repeated 连接...但是为什么连接 固定数量的值 不值得i>.
    • @Jon-Skeet:感谢您的快速澄清......我也应该检查 IL ......这也是 int 添加的方式吗?通过调用 Add 方法?
    • 但请注意,现在string.Concatstring.Join 方法有许多重载,包括一些采用IEnumerable<> 实例。所以在大多数情况下,它们比使用StringBuilder更方便(我不知道这些方法内部是否使用StringBuilder,我只是说它们在大多数情况下更方便)。
    猜你喜欢
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 2014-02-27
    • 2016-07-19
    • 2020-11-07
    • 2013-06-16
    • 1970-01-01
    相关资源
    最近更新 更多