String.Format vs“string”+“string”还是StringBuilder?

时间:2009-05-28 03:24:13

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

  

可能重复:
  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();

2 个答案:

答案 0 :(得分:18)

  • 编译器将尽可能多地优化字符串连接,因此例如,为了换行而分解的字符串通常可以优化为单个字符串文字。
  • 与变量的连接将被编译为String.Concat
  • StringBuilder可以快得多,如果你对一个字符串进行了几次(大约10次左右)的“修改”,但它会带来一些额外的开销,因为它在缓冲区中分配了比你需要的更多的空间并调整了它的大小需要时内部缓冲区。

我个人几乎所有时间都使用String.Format,原因有两个:

  • 维护格式字符串要比重新排列一堆变量容易得多。
  • String.Format接受一个I​​FormatProvider,它传递给嵌入在字符串中的任何IFormattable类型(例如数字),以便为指定的文化获得适当的数字格式,并且总体上可以更好地控制值的格式化方式。

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

还有两件事需要注意......

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

答案 1 :(得分:1)

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

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