2011-01-12 58 views
8

在C#中,可以串联几种不同的方式串:什么时候应该使用String.Format或String.Concat而不是连接运算符?

使用连接符:

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。

回答

16

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

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

+1来抵消不当的downvote。 – LukeH 2011-01-12 11:56:09

+0

是的,很好的链接+1。 – StuartLC 2011-01-12 11:57:21

+4

使用字符串连接通常会在内存中产生大量小对象,这可能会影响垃圾收集性能。通过链路测试来衡量这种影响非常困难,但对于性能要求较高的大型系统来说,这可能是一个非常大的性能问题。 – 2011-01-12 11:57:42

2

性能考虑往往是决定背后的驱动因素。见Ayende的文章this

0

它不建议存放字符串中的代码,所以如果你决定要提取代码的字符串,然后用的String.Format它会更容易做

3

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

如果您需要连接超过5个字符串,请使用StringBuilder,因为它会快得多。

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. 
相关问题