2013-08-07 3 views
4

MSDN говорит, что нам нужно преобразовать StringBuilder объект в string, но StringBuilder работает нормально? Зачем нам конвертировать?Почему мы должны использовать метод ToString с помощью 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(); 
+1

Там нет переопределение Console.WriteLine для StringBuilder arg. Таким образом, он просто вызывает объект Object arg, а затем использует .ToString() внутренне, поэтому они оба делают то же самое. – acrilige

+0

Вам не нужно использовать '.ToString()', если вы специально вызываете 'Console.WriteLine', но вы будут нуждаться в этом почти для всех остальных. – Jon

ответ

10

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

И WriteLine(object) перегрузка вызывает «... метод ToString value вызывается для создания его строкового представления, а результирующая строка записывается в стандартный поток вывода». (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 - лучший выбор, s улучшает читаемость кода. – 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(), который принимает объект. Как уже упоминалось here метод ToString() будет называться на Builder:

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

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

0

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

return "[" + sbFinalContents + "]"; 

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

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

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

Смежные вопросы