Ответ
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 сегодня:
- Рефлексия (
GetType(),Activator.CreateInstance). - Работа с API, требующими максимальной универсальности (например, некоторые методы сериализации).
- Параметры типа
params object[]в методах типаString.Format. - Явная реализация устаревших интерфейсов.