我什么时候应该使用String.Format或String.Concat而不是串联运算符?

时间:2011-01-12 11:45:32

标签: c# string concatenation

在C#中,可以通过几种不同的方式连接字符串:

使用连接运算符:

var newString = "The answer is '" + value + "'.";

使用String.Format

var newString = String.Format("The answer is '{0}'.", value);

使用String.Concat

var newString = String.Concat("The answer is '", value, "'.");

每种方法的优点/缺点是什么?我什么时候应该比其他人更喜欢?

问题出现是因为开发人员之间的争论。一个从不使用String.Format进行连接 - 他认为这是用于格式化字符串,而不是用于连接,并且这总是不可读的,因为字符串中的项以错误的顺序表示。其他经常使用String.Format进行连接,因为他认为它使代码更易于阅读,尤其是涉及多组引号时。这两个开发人员也使用连接运算符和String.Builder。

7 个答案:

答案 0 :(得分:16)

关于速度,它几乎总是doesn't matter

var answer = "Use what makes " + "the code most easy " + "to read";

答案 1 :(得分:3)

当我将超过2或3个值链接在一起时,我通常会使用string.Format,因为它可以更容易地看到最终结果的样子。连接字符串很慢,因为您需要为每个操作创建一个新的字符串对象。

如果你需要加入超过5个字符串,请使用StringBuilder,因为它会更快。

答案 2 :(得分:3)

我通常会考虑可读性,并倾向于使用格式。大多数代码都是一次写入并多次读取,因此确保读者能够快速理解所说的内容对我来说更重要(对我而言)。

答案 3 :(得分:3)

很奇怪,但String.Format在内部使用StringBuilder.AppendFormat()。例如,String.Format代码看起来像:

public static string Format(IFormatProvider provider, string format, params object[] args)
{
  if (format == null || args == null)
   throw new ArgumentNullException((format == null ? "format" : "args"));

  StringBuilder builder = new StringBuilder(format.Length + (args.Length * 8));
  builder.AppendFormat(provider, format, args);
  return builder.ToString();
}

有关此内容的更多信息,您可以找到here。那么,为什么我们这里没有提到StringBuilder.AppendFormat()!

关于主要问题:

关键是为工作挑选最好的工具。我的意思是什么?考虑一下这些令人敬畏的智慧之词:

* Concatenate (+) is best at concatenating. 
* StringBuilder is best when you need to building.
* Format is best at formatting.

答案 4 :(得分:2)

性能方面的考虑通常是这一决定背后的驱动因素。请参阅Ayende的this文章。

答案 5 :(得分:0)

不建议在代码中存储字符串,因此如果您决定从代码中提取字符串,那么使用String.Format将更容易实现

答案 6 :(得分:0)

这是一篇关于各种连接方法和用于生成IL的编译器优化的内存使用情况的文章。 Concatenation methods and optimization issue