Каким типом данных является Object в C#?

«Каким типом данных является Object в C#?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

object (псевдоним для System.Object) — это корневой ссылочный тип в системе типов C#. Все типы, как ссылочные (class), так и значимые (struct), прямо или косвенно наследуются от object.

Ключевые особенности:

  • Универсальный контейнер: Может хранить значение любого типа благодаря механизму упаковки (boxing) для значимых типов.
  • Базовый функционал: Определяет базовые методы, доступные всем объектам: Equals(), GetHashCode(), ToString(), GetType().

Пример использования и последствия:

object container = 42; // Boxing: int упаковывается в object (выделение в куче)
int number = (int)container; // Unboxing: распаковка обратно в int

// Использование в необобщённой коллекции (устаревший подход)
ArrayList oldList = new ArrayList();
oldList.Add(10); // Происходит boxing при каждом добавлении
oldList.Add("Text");

int value = (int)oldList[0]; // Требуется приведение типа и unboxing

Почему это важно? Частая упаковка/распаковка создает нагрузку на сборщик мусора. Поэтому с появлением обобщений (generics) использование object в качестве универсального контейнера стало антипаттерном.

Современная альтернатива:

// Использование обобщённой коллекции
List<int> genericList = new List<int>();
genericList.Add(10); // Boxing НЕ происходит, тип сохраняется как int
int value = genericList[0]; // Приведение типа не требуется

Основные сценарии использования object сегодня:

  1. Рефлексия (GetType(), Activator.CreateInstance).
  2. Работа с API, требующими максимальной универсальности (например, некоторые методы сериализации).
  3. Параметры типа params object[] в методах типа String.Format.
  4. Явная реализация устаревших интерфейсов.