17

可能重複:
Is String.Format as efficient as StringBuilder
C# String output: format or concat?String.Format vs「string」+「string」或StringBuilder?

什麼是效率優先,哪些應該是喜歡每個以下條件:

String.Format("{0}, {1}", city, state); 

city + ", " + state; 

StringBuilder sb = new StringBuilder(); 
sb.Append(city); 
sb.Append(", "); 
sb.Append(state); 
sb.ToString(); 
+2

@Shimmy:看看這個http://stackoverflow.com/questions/6785/is-string-format-as-efficient-as-stringbuilder – shahkalpesh 2009-05-28 03:31:11

+0

http://blogs.msdn。com/b/ricom/archive/2004/03/12/performance-quiz-1-of-a-series.aspx – Freelancer 2013-05-28 10:41:04

+1

http://www.codinghorror.com/blog/archives/001218.html – Freelancer 2013-05-28 11:04:32

回答

18
  • 編譯器將優化儘可能多的字符串concat,因此,例如,爲斷行目的而分解的字符串通常可以優化爲單個字符串文字。
  • 級聯使用的變量會被編譯成String.Concat
  • StringBuilder的可快了很多,如果你正在做一些(超過10個,所以我猜)「修改」的字符串,但它會帶來一些額外的開銷,因爲它會在緩衝區中分配比您需要的更多空間,並在需要時調整內部緩衝區的大小。

我個人使用的String.Format幾乎所有的時間,原因有二:

  • 這是一個更容易維護格式字符串比重新安排一組變量。
  • String.Format採用IFormatProvider傳遞給嵌入在字符串中的任何IFormattable類型(如數字),以便爲指定的區域性獲得適當的數字格式,並且更好地控制如何對值進行格式化。

例如,因爲有些文化使用逗號作爲小數點你想以確保無論是StringBuilder的或的String.Format您指定CultureInfo.InvariantCulture如果你想確保數字被格式化你想讓你的方式。

兩件事要注意...

  • StringBuilder的也有一個AppendFormat功能,讓你的String.Format的靈活性,而無需不必要的第二緩衝器。
  • 當使用StringBuilder時,確保您不會通過連接傳遞給Append的參數來達到目的。這是一個容易錯過的人。
1

沒有相關性差異。但假設String.Format內部使用StringBuilder(可以使用Reflector工具查看),直接使用StringBuilder.Append應該更快。

編輯:當然,使用「+」運算符是最差的選項,因爲它爲每個串聯的字符串創建一個新的字符串實例。

+0

錯,根據我貼的波紋管的鏈接,好像比+最好的方法是 – Shimmy 2009-05-28 04:18:56

+1

@shimmy,那個鏈接裏沒有StringBuilder。另外,在那個測試中,你只連接3個字符串,字符串的數量會影響性能。 – 2013-03-29 23:33:25

+0

編輯錯誤。 C#編譯器將字符串或對象組裝成一個數組,然後調用String.Concat()。我希望String.Concat(string [])是最有效的,因爲實現可以將字符串分配給正確的長度。 – 2017-10-27 17:28:00

相關問題