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();
答案 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()
方法。如上所述here,ToString()
将调用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参数的方法或在用户界面中显示它。“
从技术上讲,我没有做任何一个(我只是回复一个字符串),但我仍然感到惊讶它没有失败。