2013-08-07 81 views
4

MSDN說我們需要將StringBuilder對象轉換爲string,但StringBuilder工作正常嗎? 我們爲什麼要轉換?爲什麼我們應該使用StringBuilder的ToString方法?

string[] spellings = { "hi", "hiii", "hiae" }; 

StringBuilder Builder = new StringBuilder(); 

int counter = 1; 

foreach (string value in spellings) 
{ 
    Builder.AppendFormat("({0}) Which is Right spelling? {1}", counter, value); 
    Builder.AppendLine(); 
    counter++; 
} 

Console.WriteLine(Builder); // Works Perfectly 
//Why should i use tostring like below 
Console.WriteLine(Builder.ToString()); 
// Does it make any difference in above two ways. 

Console.ReadLine(); 
+1

沒有爲StringBuilder的沒有個Console.WriteLine覆蓋所以它只是調用Object arg然後在內部使用.ToString(),所以它們都做同樣的事情 – acrilige

+0

如果明確調用Console.WriteLine,則不需要使用'.ToString()',但是你幾乎所有其他的東西都需要它 – Jon

回答

10

這兩個呼叫使用不同的Console.WriteLine重載:WriteLine(Object)WriteLine(String)

WriteLine(object)重載調用「...調用ToString方法的值以產生其字符串表示形式,並將結果字符串寫入標準輸出流。」 (msdn

編輯

這裏我可以看到的唯一區別是:

StringBuilder sb = null; 
Console.WriteLine(sb); // prints terminator 
Console.WriteLine(sb.ToString()); // throws NullReferenceException 
+0

和WriteLine(Object obj)可能調用obj.ToString() – x4rf41

+0

@ x4rf41'WriteLine(object)'*明確*調用'ToString' –

+1

儘管事實上,這些兩個調用的效果相同,顯式調用ToString似乎是更好的選擇,a它改善了代碼的可讀性。 – BartoszKP

2

在這種具體的例子,無論是做工精細,因爲Console.WriteLine將調用ToString()你,就什麼你通過它。以下也適用:

Console.WriteLine(3); //called with an int; 
Console.WriteLine(DateTime.Now); 
Console.WriteLine(new {}); //called with an object 

然而,由於StringBuilder不是字符串,(而是一個對象,可以使一個字符串你),你不能把它傳遞給需要字符串的方法,即

public void PrintMe(string value) 
{ 
    Console.WriteLine(value); 
} 

StringBuilder sb = new StringBuilder(); 
PrintMe(sb); // this will not work 
+0

+1爲匿名空對象...我不知道你可以創建它(但最終,這不是JavaScript ......這幾乎是無用的) – xanatos

0

寫入控制檯的兩行代碼以不同的方式執行相同的操作。第二個更明顯。

Console.WriteLine(Builder);使用重載WriteLine()方法,該方法需要一個對象。如前所述hereToString()方法將被調用的Builder

「如果值爲空,只有行結束寫入。否則,將調用 的ToString方法以產生其字符串 表示形式,並將結果字符串寫入標準的 輸出流。

在第二行Console.WriteLine(Builder.ToString());您正在顯式調用ToString()方法。這是比較好的,因爲開發人員可以立即看到代碼正在做什麼。

0

這是來自Web表單上的代碼隱藏。我附加了幾次到我的StringBuilder和意外

return "[" + sbFinalContents + "]"; 

我沒有任何麻煩。我不小心遺漏了ToString()部分,我幾天沒有注意到。任何想法爲什麼這不爆炸?

StringBuilder.ToString Method(.NET 4):「你必須調用ToString方法到StringBuilder對象轉換爲String對象才能路過StringBuilder對象代表的具有字符串參數的方法的字符串或者將其顯示在用戶界面中。

技術上,我沒有做任何一個(我只是返回一個字符串),但我依然驚訝它沒有出現故障。

相關問題