4

MSDN 说我们需要将StringBuilderobject 转换为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

4 回答 4

10

这两个调用使用不同的Console.WriteLine重载:WriteLine(Object)WriteLine(String).

并且WriteLine(object)重载调用“......调用 value 的 ToString 方法以生成其字符串表示形式,并将生成的字符串写入标准输出流。” ( msdn )

编辑

我能看到的唯一区别是:

StringBuilder sb = null;
Console.WriteLine(sb); // prints terminator
Console.WriteLine(sb.ToString()); // throws NullReferenceException
于 2013-08-07T09:20:44.353 回答
2

在该特定示例中,两者都可以正常工作,因为Console.WriteLineToString()在您传递的任何内容上为您调用。以下也有效:

 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
于 2013-08-07T09:23:45.300 回答
0

写入控制台的两行代码都以不同的方式做同样的事情。第二个更明显。

Console.WriteLine(Builder);WriteLine()使用接受对象的重载方法。如此处所述ToString()方法将在以下位置调用Builder

'如果值为空,则只写入行终止符。否则,将调用 value 的 ToString 方法以生成其字符串表示形式,并将生成的字符串写入标准输出流。

在第二行Console.WriteLine(Builder.ToString());中,您正在显式调用该ToString()方法。这是更可取的,因为开发人员可以立即清楚代码在做什么。

于 2013-08-07T09:25:12.613 回答
0

这是来自网络表单上的代码隐藏。我多次附加到我的 StringBuilder 并且不小心做了

return "[" + sbFinalContents + "]";

我没有遇到任何麻烦。我不小心遗漏了 ToString() 部分,几天都没有注意到。知道为什么这不会爆炸吗?

StringBuilder.ToString Method (.net 4.) :“必须调用 ToString 方法将 StringBuilder 对象转换为 String 对象,然后才能将StringBuilder 对象表示的字符串传递给具有 String 参数的方法或将其显示在用户界面。

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

于 2015-10-18T09:21:30.320 回答