2013-08-07 58 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对象代表的具有字符串参数的方法的字符串或者将其显示在用户界面中。

技术上,我没有做任何一个(我只是返回一个字符串),但我依然惊讶它没有出现故障。

相关问题