2011-01-12 60 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. 
相關問題