Menu
Coddy logo textTech

Переопределение ToString()

Часть раздела Объектно-ориентированное программирование путешествия по C# на Coddy — урок 38 из 70.

Каждый класс в C# наследуется от object, который предоставляет метод ToString(). По умолчанию он возвращает полное имя типа — это не очень полезно, когда вы хотите увидеть фактические данные объекта.

Вы можете переопределить ToString(), чтобы возвращать осмысленное строковое представление вашего объекта:

public class Person
{
    public string Name { get; }
    public int Age { get; }
    
    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
    
    public override string ToString()
    {
        return $"{Name} ({Age} years old)";
    }
}

Теперь при выводе или конкатенации объекта Person вы получаете читаемый вывод:

Person p = new Person("Alice", 30);
Console.WriteLine(p);  // Алиса (30 лет)

Без переопределения это вывело бы что-то вроде MyNamespace.Person. Ключевое слово override необходимо, потому что вы заменяете унаследованный метод из object. Это особенно полезно для отладки и логирования, когда вам нужно быстро получить представление о состоянии объекта.

challenge icon

Задание

Легко

Давайте создадим класс Book, который предоставляет осмысленное строковое представление при выводе на печать, что делает отладку и отображение информации о книге гораздо более интуитивно понятными.

Вы организуете свой код в двух файлах:

  • Book.cs: Создайте класс Book в пространстве имен Library, который представляет книгу с ее основными данными. Ваша книга должна иметь:
    • Три свойства только для чтения: Title (string), Author (string) и Year (int)
    • Конструктор, который принимает название, автора и год именно в таком порядке
    • Переопределенный метод ToString(), который возвращает отформатированную строку: "{Title}" by {Author} ({Year})
    Обратите внимание, что название в выводе должно быть заключено в двойные кавычки!
  • Program.cs: В основном файле создайте объект Book, используя входные значения, и выведите его напрямую. Благодаря переопределению ToString(), передача объекта книги в Console.WriteLine() автоматически отобразит отформатированную информацию вместо имени типа.

Вы получите три входных значения:

  • Название книги (string)
  • Имя автора (string)
  • Год издания (integer)

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

Например, если на вход подаются The Great Gatsby, F. Scott Fitzgerald и 1925, результат должен быть следующим:

"The Great Gatsby" by F. Scott Fitzgerald (1925)

Магия здесь в том, что вы не вызываете ToString() явно — когда вы передаете объект в Console.WriteLine(), он автоматически вызывает метод ToString() этого объекта. Ваше переопределение делает этот вывод полезным вместо того, чтобы просто показывать Library.Book!

Шпаргалка

Каждый класс в C# наследуется от object, который предоставляет метод ToString(). По умолчанию он возвращает полное имя типа.

Переопределите ToString(), чтобы возвращать осмысленное строковое представление:

public class Person
{
    public string Name { get; }
    public int Age { get; }
    
    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
    
    public override string ToString()
    {
        return $"{Name} ({Age} years old)";
    }
}

При выводе объекта на печать ToString() вызывается автоматически:

Person p = new Person("Alice", 30);
Console.WriteLine(p);  // Alice (30 years old)

Ключевое слово override требуется при замене унаследованного метода из object.

Попробуйте сами

using System;
using Library;

class Program
{
    public static void Main(string[] args)
    {
        // Чтение входных данных
        string title = Console.ReadLine();
        string author = Console.ReadLine();
        int year = Convert.ToInt32(Console.ReadLine());

        // TODO: Создать объект Book, используя введенные значения

        // TODO: Вывести объект book напрямую с помощью Console.WriteLine()
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование