String.Format 与“字符串”+“字符串”或 StringBuilder?[复制]
-
06-09-2019 - |
题
性能优先级是什么以及优先选择以下各项的条件是什么:
String.Format("{0}, {1}", city, state);
或者
city + ", " + state;
或者
StringBuilder sb = new StringBuilder();
sb.Append(city);
sb.Append(", ");
sb.Append(state);
sb.ToString();
解决方案
- 编译器将尽可能多地优化字符串连接,因此,例如,出于换行目的而分解的字符串通常可以优化为单个字符串文字。
- 与变量的连接将被编译为 String.Concat
- 如果您对字符串进行多次(我猜超过 10 次左右)“修改”,StringBuilder 可能会快得多,但它会带来一些额外的开销,因为它会在缓冲区中分配比您需要的更多的空间,并在以下情况下调整其内部缓冲区的大小:它需要。
我个人几乎所有时间都使用 String.Format 有两个原因:
- 维护格式字符串比重新排列一堆变量要容易得多。
- String.Format 采用 IFormatProvider,该 IFormatProvider 会传递给嵌入字符串中的任何 IFormattable 类型(例如数字),以便您获得适合指定区域性的数字格式,并且总体上可以更好地控制值的格式设置。
例如,由于某些区域性使用逗号作为小数点,如果您想确保数字按照您想要的方式格式化,您需要确保使用 StringBuilder 或 String.Format 指定 CultureInfo.InvariantCulture。
还有两点需要注意...
- StringBuilder 还有一个 AppendFormat 函数,它为您提供了 String.Format 的灵活性,而不需要不必要的第二个缓冲区。
- 使用 StringBuilder 时,请确保不会通过连接传递给 Append 的参数来达到目的。这是一个很容易错过的地方。
其他提示
有没有相关性差异。但假设的String.Format内部使用一个StringBuilder(你可以看到,与反射器工具),使用直接StringBuilder.Append应更快。
编辑:当然是用“+”操作符是最糟糕的选择,因为它会为你拼接每个字符串的新字符串实例
。不隶属于 StackOverflow