【问题标题】:String.Format vs "string" + "string" or StringBuilder? [duplicate]String.Format 与“字符串”+“字符串”还是 StringBuilder? [复制]
【发布时间】:2010-10-29 11:24:41
【问题描述】:

可能的重复:
Is String.Format as efficient as StringBuilder
C# String output: format or concat?

什么是性能优先级以及优先选择以下各项的条件:

String.Format("{0}, {1}", city, state);

或

city + ", " + state;

或

StringBuilder sb = new StringBuilder();
sb.Append(city);
sb.Append(", ");
sb.Append(state);
sb.ToString();

【问题讨论】:

标签: .net performance stringbuilder string-concatenation string.format


【解决方案1】:

没有相关的差异。但是假设 String.Format 内部使用了 StringBuilder(可以通过 Reflector 工具看到),直接使用 StringBuilder.Append 应该会更快。

编辑:当然,使用“+”运算符是最糟糕的选择,因为它为您要连接的每个字符串创建一个新的字符串实例。

【讨论】:

  • 错了,根据我在下面发布的链接,似乎 + 是最好的方法
  • @shimmy,该链接中没有 StringBuilder。另外,在那个测试中,你只连接了 3 个字符串,字符串的数量对性能影响很大。
  • 编辑错误。 C# 编译器会将字符串或对象组装成一个数组,然后调用 String.Concat()。我希望 String.Concat(string[]) 是最有效的,因为实现可以将字符串分配到完全正确的长度。
【解决方案2】:
  • 编译器将尽可能多地优化字符串concat,因此例如,刚刚为换行目的而拆分的字符串通常可以优化为单个字符串文字。
  • 与变量的连接将被编译成String.Concat
  • StringBuilder 如果您对字符串进行多次(我猜超过 10 次左右)“修改”,则速度可能会快很多,但它会带来一些额外的开销,因为它在缓冲区中分配的空间比您需要的更多,并调整其内部大小需要时缓冲。

我个人几乎一直使用String.Format,原因有两个:

  • 维护格式字符串比重新排列一堆变量要容易得多。
  • String.Format 采用 IFormatProvider 传递给嵌入在字符串中的任何 IFormattable 类型(例如数字),以便您为指定的 culture 获得适当的数字格式,并且总体上只是更多地控制值的格式。

例如,由于某些文化使用逗号作为小数点,如果您想确保数字的格式符合您的预期,您需要确保使用StringBuilder 或String.Format 指定CultureInfo.InvariantCulture。

还有两点需要注意...

  • StringBuilder 还具有AppendFormat 函数,它为您提供String.Format 的灵活性,而无需不必要的第二个缓冲区。
  • 使用StringBuilder 时,请确保不要通过连接传递给Append 的参数来破坏目的。很容易错过。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-09
    • 2016-01-22
    • 1970-01-01
    • 2019-03-09
    • 2015-11-27
    • 2014-11-05
    • 2017-11-17
    相关资源
    最近更新 更多