String.Format vs"string"+"string"还是StringBuilder?

Shi*_*mmy 17 .net performance stringbuilder string.format string-concatenation

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

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

String.Format("{0}, {1}", city, state);
Run Code Online (Sandbox Code Playgroud)

要么

city + ", " + state;
Run Code Online (Sandbox Code Playgroud)

要么

StringBuilder sb = new StringBuilder();
sb.Append(city);
sb.Append(", ");
sb.Append(state);
sb.ToString();
Run Code Online (Sandbox Code Playgroud)

Jos*_*osh 19

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

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

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

例如,由于某些文化使用逗号作为小数点,因此如果要确保按照预期的方式格式化数字,则需要使用StringBuilder或String.Format来确保指定CultureInfo.InvariantCulture.

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

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