为什么我们应该使用StringBuilder的ToString方法?

时间:2013-08-07 09:19:07

标签: c# string tostring stringbuilder

MSDN说我们需要将StringBuilder对象转换为string,但StringBuilder工作正常吗? 我们为什么要转换?

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();

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:0)

写入控制台的两行代码都以不同的方式执行相同的操作。第二个更明显。

Console.WriteLine(Builder);使用带有对象的重载WriteLine()方法。如上所述hereToString()将调用Builder方法:

  

'如果value为null,则只写入行终止符。否则,   调用ToString方法来生成其字符串   表示,并将结果字符串写入标准   输出流。'

在第二行Console.WriteLine(Builder.ToString());中,您明确调用ToString()方法。这是首选,因为开发人员可以立即看到代码正在做什么。

答案 3 :(得分:0)

这是来自网络表单上的代码隐藏。我多次附加到我的StringBuilder并意外地做了

return "[" + sbFinalContents + "]";

我没有遇到任何麻烦。我意外地离开了ToString()部分,我甚至没有注意到几天。知道为什么这不会爆炸?

StringBuilder.ToString Method(。net 4.):“在传递StringBuilder对象表示的字符串之前,必须调用ToString方法将StringBuilder对象转换为String对象 < strong>到具有String参数的方法或在用户界面中显示它。

从技术上讲,我没有做任何一个(我只是回复一个字符串),但我仍然感到惊讶它没有失败。