Підрозділ 4.7
Клас System.Object та його методи
Пояснює базовий клас System.Object і методи ToString, GetHashCode, GetType та Equals.
4.7. Клас System.Object та його методи
Усі класи в .NET — як вбудовані (int, string, DateTime), так і ті, що ми створюємо самостійно — є похідними від класу System.Object. Навіть якщо ми не вказуємо Object як базовий, компілятор додає це успадкування неявно. Це означає, що кожен об'єкт у C# гарантовано має чотири методи: ToString(), GetHashCode(), Equals() та GetType().

Метод ToString
Метод ToString() повертає рядкове представлення об'єкта. Для числових типів це їхнє значення у вигляді рядка. Для власних класів стандартна реалізація повертає повну назву типу з простором імен:
Ми можемо перевизначити ToString(), щоб повертати змістовний рядок замість назви типу:
Зверніть увагу: Console.WriteLine(patient) автоматично викликає ToString() без явного звернення. Це справедливо для рядкової інтерполяції та конкатенації рядків — $"Пацієнт: {patient}" теж неявно викликає ToString().
Якщо клас частково заповнений (наприклад, відсутнє ім'я), можна повернути результат базової реалізації через base.ToString():
Метод GetHashCode
Метод GetHashCode() повертає ціле число — хеш-код об'єкта. Хеш-коди використовуються колекціями на основі хеш-таблиць (Dictionary<K,V>, HashSet<T>) для швидкого пошуку та зберігання об'єктів.
HashCode.Combine(...) — зручний вбудований спосіб об'єднати хеш-коди кількох полів. Два об'єкти, які рівні за Equals, зобов'язані повертати однаковий хеш-код — це фундаментальний контракт, який забезпечує коректну роботу колекцій.
Контракт рівності: Equals і GetHashCode завжди разом
Методи Equals і GetHashCode утворюють контракт рівності: якщо два об'єкти рівні (Equals повертає true), вони повинні мати однаковий хеш-код. Порушення цього правила призводить до некоректної поведінки словників і множин — об'єкти, які логічно рівні, не знаходитимуться у колекції.
Тому: якщо перевизначаєте Equals — завжди перевизначайте GetHashCode, і навпаки.
У клінічному контексті логічно вважати двох пацієнтів однаковими, якщо збігається їхній унікальний ідентифікатор картки (RecordId), — навіть якщо ім'я записане по-різному.
Метод GetType
Метод GetType() повертає об'єкт типу Type, який описує реальний тип об'єкта під час виконання. На відміну від інших методів Object, GetType() не можна перевизначити — це гарантує надійність системи типів:
GetType() завжди повертає реальний тип об'єкта, навіть якщо змінна оголошена як базовий тип. Це відрізняє його від оператора is, який також перевіряє сумісність з ієрархією (тобто patient is Person поверне true), тоді як GetType() == typeof(Person) поверне false для об'єкта Patient.