Что такое System.Object в C#?

Ответ

System.Object (или object — ключевое слово-псевдоним в C#) — это корневой базовый класс для всех типов в .NET. Каждый класс, структура, делегат или массив прямо или косвенно наследуется от Object.

Ключевые методы, предоставляемые Object:

  • Equals() — определяет равенство объектов.
  • GetHashCode() — возвращает хэш-код, используемый в хэш-таблицах.
  • ToString() — возвращает строковое представление объекта. По умолчанию выводит полное имя типа.
  • GetType() — возвращает объект Type, содержащий метаданные о типе объекта во время выполнения (RTTI).
  • MemberwiseClone() — создает поверхностную копию объекта.
  • ReferenceEquals() — статический метод для сравнения ссылок.

Пример и важность:

// Все типы могут быть приведены к object
int number = 42;
object boxed = number; // Упаковка (boxing)
int unboxed = (int)boxed; // Распаковка (unboxing)

// Методы доступны для любого объекта
string representation = anyObject.ToString();
Type runtimeType = anyObject.GetType();

Понимание System.Object критически важно для работы с коллекциями (ArrayList, List<object>), механизмами рефлексии, переопределения поведения по умолчанию (например, для Equals и GetHashCode в своих классах) и понимания системы типов .NET в целом.

Ответ 18+ 🔞

А, ну это же наша базовая, мать её, основа всего! System.Object, он же просто object в C# — это типа как прародитель, дедушка всех классов в .NET. Абсолютно всё, что ты создаёшь — твой класс, структура, массив, делегат — всё это, в конечном счёте, торчит корнями из этого самого Object. Без него нихуя не работает.

Чем он, этот дед, вообще полезен? Какие методы даёт?

Ну, стандартный набор, без которого никуда:

  • Equals() — чтобы сравнивать, одинаковые объекты или нет. По умолчанию тупо ссылки сверяет, что обычно хуйня полная, поэтому его почти всегда переписывают.
  • GetHashCode() — выдаёт числовой код. Критически важен, если суёшь объекты в словарь (Dictionary) или хэш-сет. Идёт рука об руку с Equals() — если переопределил один, будь добр, перепиши и второй, а то будет тебе пиздец и не найдёшь ничего в коллекции.
  • ToString() — возвращает строку. По умолчанию выводит полное имя типа сборки, что обычно нахуй никому не упало, поэтому его тоже все переопределяют, чтобы что-то человеческое показывал.
  • GetType() — вот это мощь! Возвращает объект Type, который тебе всю подноготную о классе во время выполнения выложит (рефлексия, ёпта!). Узнать, что за тип, какие поля, методы — всё через него.
  • MemberwiseClone() — создаёт поверхностную копию объекта (клонирует поля, но если там ссылки — копируются ссылки, а не объекты). Защищённый метод, просто так не вызовешь.
  • ReferenceEquals() — статический метод, который тупо проверяет, ссылаются ли две переменные на один и тот же объект в памяти. Иногда нужно.

Где это всё применяется? Ну, смотри:

// Любую хуйню можно запихнуть в object (упаковка, boxing)
int myNumber = 777;
object myBox = myNumber; // Всё, число упаковалось в объект
int myUnboxedNumber = (int)myBox; // А тут распаковываем обратно. Медленно, блядь!

// Методы-то работают отовсюду!
string someShit = anyObject.ToString(); // Вызовешь даже у пустого объекта
Type whatIsIt = anyObject.GetType(); // Узнаешь, с чем имеешь дело в рантайме

Короче, если не понимаешь System.Object — ты нихуя не понимаешь в системе типов .NET. Это нужно для коллекций вроде старого ArrayList, для рефлексии (когда ковыряешь классы как хочешь), для правильного переопределения сравнения и хэширования в своих классах. Фундамент, блядь. Без него — пизда.