2013-08-13 8 views
1

Есть ли какая-либо польза при вызове метода ToString() в построителе строк, когда вызов метода принимает объект типа как его параметр?Явный vs неявный вызов ToString()

StringBuilder sb = new StringBuilder("Hello"); 

System.Console.WriteLine(sb); 

ИЛИ

System.Console.WriteLine(sb.ToString()); 

Из того, что я знаю, что WriteLine принимает объект как перегрузки, я думаю, метод ToString() затем вызывается на объект, который затем называет StringBuilder.ToString() и возвращает ожидаемое строковое значение.

Итак, есть ли какие-либо выгоды при явном вызове ToString()? Не могли бы вы обосновать свой ответ?

+0

Предположительно, будет задействован дополнительный вызов метода, но вы бы предположили, что он просто будет скомпилирован в любом случае - накладные расходы для него были бы крошечными, если бы они даже существовали. – Jeff

ответ

2

«моя догадка метод ToString() затем вызывается на объекте»

Если посмотреть на MSDN вы видите, что нет никакой перегрузки, которая потребляет StringBuilder непосредственно, поэтому используется the one which accepts anything(object).

Итак, ваша догадка была правильной, она просто позвонит ToString.

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

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

0

Нет, нет никакой пользы. Инструменты с хорошими возможностями статического анализа, такие как ReSharper, фактически позволят вам знать, что вызов является избыточным и его можно безопасно удалить.

+0

Не могли бы вы рассказать о инструментах, которые вы могли бы использовать? Я видел, как люди говорили об использовании Reflector, чтобы определить, что происходит. Как я могу узнать, не используя ReSharper?Возможно, что-то, что встроено в Visual Studio. – cgatian

+0

В основном вы узнали, как узнать: 1) Используйте инструмент отражателя, чтобы посмотреть на код фрейма 2) Используйте инструмент, который выполняет статический анализ кода. –

2

Единственное преимущество в том, что ясно, что вы делаете. Если вы можете указать что-то явно, сделайте это - это сделает код более читаемым.

+1

Это очень простое заявление. , Фактически, с соответствующим именем для 'StringBuilder', я бы сказал, что это необязательно -' WriteLine (OutputText) 'не менее понятен, чем' WriteLine (OutputText.ToString()) ' – Jeff

+1

Я не согласен и точка перегрузка 'WriteLine' - это то, что вам не нужно явно вызывать' ToString'. В первом случае совершенно ясно, что он хочет распечатать содержимое строкового построителя. –

+0

Возможно, на этом уровне детализации это вопрос мнения. Вероятно, вы правы, что с хорошим именем в этой простой ситуации этого может быть достаточно, если область мала. Однако, если бы это была переменная экземпляра, то вызов этого «OutputText» был бы немного вводить в заблуждение, потому что это не «текст» - это текстовый (строковый) построитель. – BartoszKP

2

Есть ли какая-либо польза от явного вызова ToString()?

Console.WriteLine (объект) сначала проверит, является ли объект нулевым, и если он просто выводит пустую строку. Вызов ToString для нулевого объекта приведет к исключению NullReferenceException.

Таким образом, WriteLine (объект) построил нуль-безопасность, а результат для null будет таким же, как и для ненулевого объекта, который выводит пустую строку. В зависимости от контекста эта нулевая безопасность может быть удобной или может привести к нежелательному поведению.

Короче говоря, более выгодно вызывать ToString(), если вы не хотите исключить исключение NullReferenceException.

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