Полное руководство по языку программирования С# 14 и платформе .NET 10 / Объектно-ориентированное программирование

Класс System.Object и его методы

Начальный ⏱ 5 мин чтения 👁 2 🕓 обновлено 11.08.2026

Все классы в .NET, даже те, которые мы сами создаем, а также базовые типы, такие как System.Int32, являются неявно производными от класса Object. Даже если мы не указываем класс Object в качестве базового, по умолчанию неявно класс Object все равно стоит на вершине иерархии наследования. Поэтому все типы и классы могут реализовать те методы, которые определены в классе System.Object. Рассмотрим эти методы.

ToString

Метод ToString служит для получения строкового представления данного объекта. Для базовых типов просто будет выводиться их строковое значение:


int i = 5;
Console.WriteLine(i.ToString()); // выведет число 5

double d = 3.5;
Console.WriteLine(d.ToString()); // выведет число 3,5

Для классов же этот метод выводит полное название класса с указанием пространства имен, в котором определен этот класс. И мы можем переопределить данный метод. Посмотрим на примере:


Person person = new Person { Name = "Tom" };
Console.WriteLine(person.ToString()); // выведет название класса Person

Clock clock = new Clock { Hours = 15, Minutes = 34, Seconds = 53 };
Console.WriteLine(clock.ToString()); // выведет 15:34:53

class Clock
{
    public int Hours { get; set; }
    public int Minutes { get; set; }
    public int Seconds { get; set; }
    public override string ToString()
    {
        return $"{Hours}:{Minutes}:{Seconds}";
    }
}
class Person
{
    public string Name { get; set; } = "";
}

Для переопределения метода ToString() в классе Clock, который представляет часы, используется ключевое слово override (как и при обычном переопределении виртуальных или абстрактных методов). В данном случае метод ToString() выводит в строке значения свойств Hours, Minutes, Seconds.

Класс Person не переопределяет метод ToString, поэтому для этого класса срабатывает стандартная реализация этого метода, которая выводит просто название класса.

Кстати в данном случае мы могли задействовать обе реализации:


Person tom = new Person { Name = "Tom" };
Console.WriteLine(tom.ToString()); // Tom

Person undefined = new Person();
Console.WriteLine(undefined.ToString()); // Person

class Person
{
    public string Name { get; set; } = "";

    public override string? ToString()
    {
        if (string.IsNullOrEmpty(Name))
            return base.ToString();
        return Name;
    }
}

То есть если имя - свойство Name не имеет значения, оно представляет пустую строку, то возвращается базовая реализация - название класса. Стоит отметить, что базовая реализация возвращает не просто строку, а объект string? - то есть это может быть строка string, либо значение null, которое указывает на отсутствие значения. И в реальности в качестве возвращаемого типа для метода мы можем использовать как string, так и string?

Если же имя у объекта Person установлено, то возвращается значение свойства Name. Для проверки строки на наличие значения применяется метод String.IsNullOrEmpty().

Стоит отметить, что различные технологии на платформе .NET активно используют метод ToString для разных целей. В частности, тот же метод Console.WriteLine() по умолчанию выводит именно строковое представление объекта. Поэтому, если нам надо вывести строковое представление объекта на консоль, то при передаче объекта в метод Console.WriteLine необязательно использовать метод ToString() - он вызывается неявно:


Person person = new Person { Name = "Tom" };
Console.WriteLine(person);	// Tom

Clock clock = new Clock { Hours = 15, Minutes = 34, Seconds = 53 };
Console.WriteLine(clock); // выведет 15:34:53

Метод GetHashCode

Метод GetHashCode позволяет возвратить некоторое числовое значение, которое будет соответствовать данному объекту или его хэш-код. По данному числу, например, можно сравнивать объекты. Можно определять самые разные алгоритмы генерации подобного числа или взять реализацию базового типа:


class Person
{
    public string Name { get; set; } = "";

    public override int GetHashCode()
    {
		return Name.GetHashCode();
    }
}

В данном случае метод GetHashCode возвращает хеш-код для значения свойства Name. То есть два объекта Person, которые имеют одно и то же имя, будут возвращать один и тот же хеш-код. Однако в реальности алгоритм может быть самым различным.

Получение типа объекта и метод GetType

Метод GetType позволяет получить тип данного объекта:


Person person = new Person { Name = "Tom" };
Console.WriteLine(person.GetType());	// Person

Этот метод возвращает объект Type, то есть тип объекта.

С помощью ключевого слова typeof мы получаем тип класса и сравниваем его с типом объекта. И если этот объект представляет тип Person, то выполняем определенные действия.


object person = new Person { Name = "Tom" };
if (person.GetType() == typeof(Person))
	Console.WriteLine("Это реально класс Person");

Причем поскольку класс Object является базовым типом для всех классов, то мы можем переменной типа object присвоить объект любого типа. Однако для этой переменной метод GetType все равно вернет тот тип, на объект которого ссылается переменная. То есть в данном случае объект типа Person.

Стоит отметить, что проверку типа в примере выше можно сократить с помощью оператора is:


object person = new Person { Name = "Tom" };
if (person is Person)
    Console.WriteLine("Это реально класс Person");

В отличие от методов ToString, Equals, GetHashCode метод GetType() не переопределяется.

Метод Equals

Метод Equals позволяет сравнить два объекта на равенство. В качестве параметра он принимает объект для сравнения в виде типа object и возврашает true, если оба объекта равны:

public override bool Equals(object? obj) {......}

Например, реализуем данный метод в классе Person:


class Person
{
	public string Name { get; set; } = "";
    public override bool Equals(object? obj)
    {
        // если параметр метода представляет тип Person
        // то возвращаем true, если имена совпадают
        if (obj is Person person) return Name == person.Name;
        return false;
    }
    // вместе с методом Equals следует реализовать метод GetHashCode
    public override int GetHashCode() => Name.GetHashCode();
}

Метод Equals принимает в качестве параметра объект любого типа, который мы затем приводим к текущему классу - классу Person.

Если переданный объект представляет тип Person, то возвращаем результат сравнения имен двух объектов Person. Если же объект представляет другой тип, то возвращается false.

В данном случае для примера применяется довольно простой алгоритм сравнения, однако при необходимости реализацию метода можно сделать более сложной, например, сравнивать по нескольким свойствам при их наличии.

Стоит отметить, что вместе с методом Equals следует реализовать метод GetHashCode.

Применение метода:


var person1 = new Person { Name = "Tom" };
var person2 = new Person { Name = "Bob" };
var person3 = new Person { Name = "Tom" };

bool person1EqualsPerson2 = person1.Equals(person2);   // false
bool person1EqualsPerson3 = person1.Equals(person3);   // true

Console.WriteLine(person1EqualsPerson2);    // false
Console.WriteLine(person1EqualsPerson3);    // true

И если следует сравнивать два сложных объекта, как в данном случае, то лучше использовать метод Equals, а не стандартную операцию ==.

Проверь себя

📋 Тест по теме «Класс System.Object и его методы» Тест по теме

Практические задания

Лёгкое Ручная проверка Заполните пропуск в коде (1)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

int i = _____;
Console.WriteLine(i.ToString()); // выведет число 5

double d = 3.5;
Console.WriteLine(d.ToString()); // выведет число 3,5
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (2)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

Person _____ = new Person { Name = "Tom" };
Console.WriteLine(person.ToString()); // выведет название класса Person

Clock clock = new Clock { Hours = 15, Minutes = 34, Seconds = 53 };
Console.WriteLine(clock.ToString()); // выведет 15:34:53

class Clock
{
    public int Hours { get; set; }
    public int Minutes { get; set; }
    public int Seconds { get; set; }
    public override string ToString()
    {
        return $"{Hours}:{Minutes}:{Seconds}";
    }
}
class Person
{
    public string Name { get; set; } = "";
}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (3)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

Person tom = _____ Person { Name = "Tom" };
Console.WriteLine(tom.ToString()); // Tom

Person undefined = new Person();
Console.WriteLine(undefined.ToString()); // Person

class Person
{
    public string Name { get; set; } = "";

    public override string? ToString()
    {
        if (string.IsNullOrEmpty(Name))
            return base.ToString();
        return Name;
    }
}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (4)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

_____ person = new Person { Name = "Tom" };
Console.WriteLine(person);	// Tom

Clock clock = new Clock { Hours = 15, Minutes = 34, Seconds = 53 };
Console.WriteLine(clock); // выведет 15:34:53
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (5)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

class Person
{
    public string Name { get; set; } = "";

    public _____ int GetHashCode()
    {
		return Name.GetHashCode();
    }
}
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (1)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

int i = _____;
Console.WriteLine(i._____()); // выведет число 5

double d = 3.5;
Console.WriteLine(d.ToString()); // выведет число 3,5
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (2)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

Person person = new Person { Name = "Tom" };
Console._____(person.ToString()); // выведет название класса Person

Clock clock = new Clock { _____ = 15, Minutes = 34, Seconds = 53 };
Console.WriteLine(clock.ToString()); // выведет 15:34:53

class Clock
{
    public int Hours { get; set; }
    public int Minutes { get; set; }
    public int Seconds { get; set; }
    public override string ToString()
    {
        return $"{Hours}:{Minutes}:{Seconds}";
    }
}
class Person
{
    public string Name { get; set; } = "";
}
Войдите, чтобы отправить решение
Среднее Ручная проверка Расставьте строки кода в правильном порядке
+20 XP

Строки кода из примера этого урока перемешаны. Впишите их в правильном порядке, каждую строку — с новой строки.

int i = 5;
double d = 3.5;
Console.WriteLine(i.ToString()); // выведет число 5
Console.WriteLine(d.ToString()); // выведет число 3,5
Войдите, чтобы отправить решение
Сложное Ручная проверка Объясните и модифицируйте пример из урока «Класс System.Object и его методы»
+30 XP

Опишите своими словами, что делает приведённый пример кода из урока «Класс System.Object и его методы», и предложите одно осмысленное изменение (например, другое входное значение или дополнительное условие). Приведите итоговый код.

int i = 5;
Console.WriteLine(i.ToString()); // выведет число 5

double d = 3.5;
Console.WriteLine(d.ToString()); // выведет число 3,5
Войдите, чтобы отправить решение
Сложное Ручная проверка Найдите потенциальную проблему в коде урока «Класс System.Object и его методы»
+30 XP

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

Person person = new Person { Name = "Tom" };
Console.WriteLine(person.ToString()); // выведет название класса Person

Clock clock = new Clock { Hours = 15, Minutes = 34, Seconds = 53 };
Console.WriteLine(clock.ToString()); // выведет 15:34:53

class Clock
{
    public int Hours { get; set; }
    public int Minutes { get; set; }
    public int Seconds { get; set; }
    public override string ToString()
    {
        return $"{Hours}:{Minutes}:{Seconds}";
    }
}
class Person
{
    public string Name { get; set; } = "";
}
Войдите, чтобы отправить решение
Мини-проект Ручная проверка Мини-проект по теме «Класс System.Object и его методы»
+50 XP

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

Войдите, чтобы отправить решение
Домашнее задание Ручная проверка Домашнее задание по теме «Класс System.Object и его методы»
+25 XP

Напишите собственную небольшую программу, применяющую материал темы «Класс System.Object и его методы». Используйте не менее одной конструкции, показанной в примерах урока. Прикрепите код решения и краткое описание того, что он делает.

Войдите, чтобы отправить решение

Обсуждение (0)

Войдите, чтобы оставить комментарий.