20

可能的重复:
String.Format 是否与 StringBuilder C# 字符串输出一样高效
:格式还是连接?

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

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

或者

city + ", " + state;

或者

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

2 回答 2

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

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

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

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

还有两点要注意...

  • StringBuilder还有一个AppendFormat功能可以让您灵活地String.Format不需要不必要的第二个缓冲区。
  • 使用时StringBuilder,请确保不要通过连接传递给的参数来破坏目的Append。很容易错过。
于 2009-05-28T03:39:51.890 回答
1

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

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

于 2009-05-28T03:36:36.267 回答