2010-03-30 42 views
1

我的靜態方法返回下面的連接字符串,這樣這是C#返回聲明好壞在性能方面?

return (Sb.ToString() + " " + ds.Tables[1].Rows[0].ItemArray[0].ToString() + " " + ds.Tables[2].Rows[0].ItemArray[0].ToString());

這是一個好/壞的做法或者我應該使用StringBuilder它....單杆

回答

9

字符串連接會比使用一個StringBuilder更快 - 如果Sb是雖然已經一個StringBuilder,它威力意義的追加到代替(假設它是一個局部變量)。假設這其實是來自一個數據庫中的數據,所花費的時間來獲取它要大大這裏超過字符串連接反正。

請注意,您並不需要所有這些調用ToString() - 這將事情做的很好:

return (Sb + " " + ds.Tables[1].Rows[0].ItemArray[0] + " " + 
     ds.Tables[2].Rows[0].ItemArray[0]); 

下面是使用現有的建設者等價的:

return Sb.Append(" ") 
     .Append(ds.Tables[1].Rows[0].ItemArray[0]) 
     .Append(" ") 
     .Append(ds.Tables[2].Rows[0].ItemArray[0]) 
     .ToString(); 

威力稍快一點 - 這取決於各種事情。就個人而言,我可能會使用串聯版本,因爲它稍微簡單一點的IMO。我非常懷疑你會看到很多不同的表現。請注意,這有點特殊,因爲您已經有StringBuilder;在連接一組項目的一般情況下,它們都可以在一個編譯時表達式中指定,因爲單個方法調用可以提供所有必需的信息,所以串聯可以更快。

我有一個page on StringBuilder vs string concatenation如果您想了解更多的細節和指導方針。

+0

它真會更快?儘管使用StringBuilder可能是「最佳實踐」,你不覺得嗎? – 2010-03-30 07:21:47

+0

@jon ya'sb'確實是一個stringbuilder ... – 2010-03-30 07:22:46

+5

@Filip:是的,它會更快。它會導致對'String.Concat'的單個調用,它可以查看所有字符串的長度,計算所需緩衝區的確切大小,將它們全部複製,然後完成。不需要額外的'StringBuilder'對象;沒有擴展緩衝區(可能涉及更多的重新分配)。如果不理解爲什麼它有時更高效,那麼使用StringBuilder絕對不是最佳實踐。 – 2010-03-30 07:24:52

2

如果你在一個緊密的循環中調用這個,你將可能會更好使用StringBuilder(但這塊應該還是異形)。否則,連接完全正常。爲了維護性/可讀性的原因,我會將其更改爲String.Format()

+0

即使你在一個循環中調用它,'StringBuilder'也不會幫助 - 注意這是一個* return *語句...連接的結果將立即返回。在這裏,''StringBuilder'幾乎可以肯定會比使用連接更慢*(可能幾乎不相關)。 – 2010-03-30 07:23:32