2016-03-21 5 views
-2

В этом примере лучше написать obj.ToString() или, может быть, только obj?Console.WriteLine (obj.ToString); vs Console.WriteLine (obj);

Object obj = new Object(); 
Console.WriteLine(obj.ToString()); 
// or 
Console.WriteLine(obj); 

И в чем же разница? Это лучший стиль кодирования?

+3

Это то же самое. В обоих случаях '.ToString' будет называться –

+0

Да, однако вопрос в том, что лучше использовать и почему? Или это зависит от вас? – What

+2

Нет никакой разницы с точки зрения использования. Так что это зависит от ваших личных \ предпочтений команды. Единственное различие заключается в том, что Console.WriteLine может ничего не отображать, если 'obj' равно null, а' obj.ToString() 'будет терпеть неудачу с NRE –

ответ

1

Вызов Console.WriteLine(obj.ToString()) и Console.WriteLine(obj) по-видимому, то же самое, но вы вызываете различные методы.

Если вы звоните Console.WriteLine(object), то подтверждение не выполняется. Если отрицательный, вызывается метод объекта ToString().

Если вы звоните Console.WriteLine(string), то подтверждение не выполняется. Если отрицательный, строка записывается напрямую.

Как правило, просто отправьте объект в порядке, проигнорируйте вызов метода ToString(). Это избыточно. Если вы это называете, убедитесь, что вы не попадаете в ловушку null. Назову это так: obj?.ToString() или быть более явным с null:

Console.WriteLine(obj == null ? "NULL" : obj); 
1

Когда вы передаете Object на номер Console.WriteLine(), он сначала проверит, реализует ли он интерфейс IFormattable. Console.WriteLine(obj.ToString()); непосредственно вызовет ToString.


Update: (относительно комментарию Rasik)

Этот пример показывает разницу в выходе двух методов. (параметр String против Object)

public class MyObject : IFormattable 
{ 
    public string ToString(string format, IFormatProvider formatProvider) 
    { 
     return "IFormattable"; 
    } 

    public override string ToString() 
    { 
     return "ToString"; 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var obj = new MyObject(); 

     Console.WriteLine(obj); 
     Console.WriteLine(obj.ToString()); 
     Console.ReadKey(); 
    } 
} 

Результаты:

IFormattable 
ToString 
+0

Я сомневаюсь, что Console.Writeline проверит проверку того, что тип входного параметра реализует IFormattable или нет? Вот подпись интерфейса API: 'IFormattable.ToString (String, IFormatProvider)' Так что для этого требуется также IFormatProvider, но не перегрузки функции Console.WriteLine не ссылаются на объект типа IFormatProvider в качестве аргумента , Он просто вызывает виртуальный, без параметров метод ToString(), определенный в базовом классе «Объект» или переопределенный метод ToString в типе объекта, передаваемого в качестве аргументов в 'Console.WriteLine'. – RBT

+1

Основная функция 'Console.Out.WriteLine()' выполняет проверку. «Thread.CurrentThread».CurrentCulture; 'будет передаваться в' formatProvider' _ (если не указано иное) _ –

+1

Очень подробное объяснение. Теперь все кристально ясно. Вы получаете мой +1. – RBT

0

Как качество катализатор сказал, когда вы используете Console.WriteLine непосредственно с объектом строки оу, вы действительно используете различные перегрузки Способ; что в этом случае нет разницы в поведении.

Надеюсь, это поможет вам!