【问题标题】:.NET String concatenation (+ & +=) vs. StringBuilder.NET 字符串连接 (+ & +=) 与 StringBuilder
【发布时间】:2012-08-02 10:05:41
【问题描述】:

我正在阅读一本名为 .NET Gotchas 的书(非常值得一读 IMO),它说明了 String 和 StringBuilder 之间的性能差异,它提出了一个我觉得无法回答的问题!虽然我不知道这两个类的内部结构(没有查看这些类的反射版本),但我想知道;既然 .NET 中的运算符是可重载的,为什么微软没有实现 String 类在内部使用 StringBuilder 并重载串联运算符以简单地调用 StringBuilder 中的 .Append()?我猜有一些根本原因说明为什么不是这样,如果是这样,为什么?

【问题讨论】:

    标签: .net string operators concatenation stringbuilder


    【解决方案1】:

    问题不在于字符串连接速度慢,而更多的是重复连接会产生大量中间字符串,需要分配并随后进行垃圾回收。

    编辑
    请注意,mystring += "a" 并不是简单地将“a”添加到前一个字符串中。它为组合创建一个新字符串并将“mystring”指向它,从而丢弃以前的值(如果没有更多对它的引用)。

    结束编辑

    一系列

    string mystring = "something";
    mystring += "something else";
    mystring = mystring + "third";
    

    如果您将每个单独的行作为 StringBuilder Append 后跟 .ToString() 以将结果返回到字符串中,则执行速度会变慢。如果您重复使用单个 StringBuilder、Append() 并在最后执行 .ToString(),您只会获得性能优势。

    StringBuilder sb = new StringBuilder();
    sb.Append("something");
    sb.Append("something else");
    sb.Append("third");
    string mystring = sb.ToString();
    

    然后一个 StringBuilder 有它自己的开销,所以如果你有少量的字符串部分要加入,它不会给你带来好处。

    请注意,编译器会优化单个语句中的串联:

    string mystring = "something" + "something else" + "third";
    

    最快。

    【讨论】:

      【解决方案2】:

      原因很简单:

      因为

      string result = a + b;
      

      更有效率
      var sb = new StringBuilder(a, a.Length + b.Length);
      sb.Append(b);
      string result = sb.ToString();
      

      StringBuilders 仅在发生大量串联时才有意义,通常在循环内。

      【讨论】:

        猜你喜欢
        • 2023-03-08
        • 2010-12-04
        • 2011-07-22
        • 2010-09-09
        • 2011-12-26
        • 1970-01-01
        • 2014-04-06
        相关资源
        最近更新 更多