2

Читал книгу и увидел такой пример кода:

public class Man 
{
   public string Name;
   public override string ToString() => Name;
}
...
Man p = new Man { Name = "Piter" };
Console.WriteLine (p);     //Piter

Непонятно, при чем тут ToString вообще и почему нам выводит имя при простом вызове экземпляра без указания поля?

αλεχολυτ
  • 28,987
  • 13
  • 60
  • 119
Nikolay
  • 824
  • "... вызове экземпляра"? В консоль выводится строковое представление объекта, которое получается вызовом виртуального метода ToString. –  Oct 03 '16 at 14:55
  • то есть я могу внутри метода переназначить ToString и указать, что он будет делать при вызове. И при каждом вызове p (неp.name и не p.ToSrting() ) у меня будет выводиться именно то, что было определено внутри public override string ToString() => Name; ? – Nikolay Oct 03 '16 at 14:59

2 Answers2

4

Согласно документации для метода Console.WriteLine:

Если переданное значение равно null, печатается только перевод строки. Иначе, печаетается результат вызова функции ToString

ToString переопределен таким образом, чтобы выводить поле Name, поэтому оно и печатается при вызове WriteLine

awesoon
  • 4,179
  • аа, понятно.. Жаль, что в учебнике об этом ни слова.. Надо было сразу подумать о документации, спасибо) – Nikolay Oct 03 '16 at 15:01
  • @Nikolay учебник наверное не особо хороший. Ознакомьтесь со списком литературы. – αλεχολυτ Oct 03 '16 at 15:04
  • @alexolut C# 6.0. Справочник. Полное описание языка Албахари читаю) ну мне в любом случае одной книгой не обойтись) – Nikolay Oct 03 '16 at 15:06
  • @Nikolay, когда не понимаете что происходит, полезно заглядывать в исходный код вызываемого метода. – iksuy Oct 03 '16 at 15:09
4

Удалим строку:

public override string ToString() => Name;

Тогда, при вызове:

Console.WriteLine (p);

Мы увидим, что то вроде:

>>Yournamespace.Man

Что не очень информативно, особенно если таких объектов несколько. Это происходит, потому что наследуемая функция ToString(), выводит полное наименование класса. Если же вам надо, чтобы ВЕЗДЕ, где класс будет отображаться на строку, было другое поведение, надо эту функцию переопределить. Что и было сделано в вышеуказанной строке.

αλεχολυτ
  • 28,987
  • 13
  • 60
  • 119
Mirdin
  • 5,849
  • он выедет название типа в виде строки, как я понимаю. Тогда какой смысл имеют функция GetType? – Nikolay Oct 03 '16 at 15:12
  • ее использовать разумней, так как она выполняет свое назначение. Я понимаю. И при переопределении ToString не вызовет ошибки. Но без определения ее можно опустить? Вопрос для общего понимания – Nikolay Oct 03 '16 at 15:14
  • 1
  • GetType возвращает тип класса а не строковое значение его имени, хотя и имя таким образом можно получить.
  • – Mirdin Oct 03 '16 at 15:22
  • Естественно ее можно не переопределять, если для поведения класса не важно что она выдает.
  • – Mirdin Oct 03 '16 at 15:23