Почему мы должны использовать метод 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();

person Registered User    schedule 07.08.2013    source источник
comment
Нет переопределения Console.WriteLine для StringBuilder arg. Так что он просто вызывает с Object arg, а затем использует .ToString() внутри, так что они оба делают одно и то же.   -  person acrilige    schedule 07.08.2013
comment
Вам не нужно использовать .ToString(), если вы специально вызываете Console.WriteLine, но вам это понадобится практически для всех других вещей.   -  person Jon    schedule 07.08.2013


Ответы (4)


Эти два вызова используют разные Console.WriteLine перегрузки: WriteLine(Object) и WriteLine(String).

И перегрузка WriteLine(object) вызывает "... метод значения ToString вызывается для создания его строкового представления, и результирующая строка записывается в стандартный поток вывода". (msdn)

Изменить

Единственная разница, которую я вижу здесь, это:

StringBuilder sb = null;
Console.WriteLine(sb); // prints terminator
Console.WriteLine(sb.ToString()); // throws NullReferenceException
person MarcinJuraszek    schedule 07.08.2013
comment
и WriteLine(Object obj), вероятно, вызывает obj.ToString() - person x4rf41; 07.08.2013
comment
@x4rf41 WriteLine(object) определенно звонит ToString. - person Adam Houldsworth; 07.08.2013
comment
И несмотря на тот факт, что эти два вызова фактически делают одно и то же, явный вызов ToString кажется лучшим выбором, поскольку он улучшает читаемость кода. - person BartoszKP; 07.08.2013
comment
+1. Я также согласен с @BartoszKP, в том числе потому, что не каждый метод имеет перегрузку, которая принимает object, кроме string. Console.WriteLinestring.Format), вероятно, редкие случаи, которые имеют такие перегрузки. Но общий случай таков: если вам нужен string, то заявите об этом явно, вместо того, чтобы полагаться на третью сторону, чтобы сделать это для вас. - person stakx - no longer contributing; 07.08.2013

В этом конкретном примере оба работают нормально, потому что 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
person SWeko    schedule 07.08.2013
comment
+1 за анонимный пустой объект... Я не знал, что вы можете его создать (но, в конце концов, это не javascript... Это почти бесполезно) - person xanatos; 07.08.2013

Обе строки кода для записи в консоль делают одно и то же по-разному. Хотя второе более очевидно.

Console.WriteLine(Builder); использует перегруженный метод WriteLine(), который принимает объект. Как упоминалось здесь, метод ToString() будет вызываться для Builder:

'Если значение равно null, записывается только признак конца строки. В противном случае вызывается метод значения ToString для создания его строкового представления, и результирующая строка записывается в стандартный поток вывода.

Во второй строке Console.WriteLine(Builder.ToString()); вы явно вызываете метод ToString(). Это предпочтительнее, потому что разработчику сразу видно, что делает код.

person Neil Mountford    schedule 07.08.2013

это из кода программной части в веб-форме. я несколько раз добавлял в свой StringBuilder и случайно сделал

return "[" + sbFinalContents + "]";

и у меня не было никаких проблем с этим. я случайно пропустил часть ToString() и даже не заметил несколько дней. есть идеи, почему это не взрывается?

метод StringBuilder.ToString (.net 4.) : «Вы должны вызвать метод ToString для преобразования объекта StringBuilder в объект String, прежде чем вы сможете передать строку, представленную объектом StringBuilder, в метод, который имеет параметр String или отобразить его в пользовательском интерфейсе."

технически я не делаю ни того, ни другого (я просто возвращаю строку), но я все еще удивлен, что это не потерпело неудачу.

person wazz    schedule 18.10.2015