C# System.Object является окончательным базовым классом

В спецификации msdn я мог заметить, что System.Object — это основной базовый класс в .Net. Говорят, что System.ValueType — это абстрактный класс, наследуемый от System.Object и переопределяет такие методы, как Equals, Compare и т. д. Типы значений, такие как bool, int и т. д., наследуются от System.ValueType, все остальные объекты .net наследуются от System.Object.

У меня есть 2 вопроса по этому поводу.

  1. Для чего нужен System.Object? Почему здесь не предпочли интерфейс?

Я предполагаю, что у него есть только 2 прямых дочерних элемента (игнорируя, что мы можем создать больше), а именно System.ValueType и System.ReferenceType, которые имеют совершенно разные реализации.

**Редактировать:**Отсутствует System.ReferenceType. Есть только System.Object и System.ValueType (переопределяющие базовый класс). Приносим извинения.

Итак, System.Object может понадобиться для обработки основных функций CLR, таких как создание объекта с помощью new(), применение конструктора по умолчанию, GC и т. д.?

  1. Когда я декомпилирую Sytem dll и вижу реализацию bool, я вижу только структуру.
    Для класса (скажем, Exception) я не вижу наследования System.ReferenceType или System.Object. Как обрабатывается это наследство?
    На самом деле, что Common Type System делает с MyCustomClass, чтобы он наследовал от System.Object (поскольку наследование определяется во время компиляции, я думаю, что CTS делает это)

Пожалуйста, не стесняйтесь исправлять меня/отредактировать пост, если я ошибаюсь.

введите здесь описание изображения


person Raghav    schedule 02.06.2015    source источник
comment
Класса System.ReferenceType нет, поэтому я понятия не имею, откуда вы это взяли.   -  person Servy    schedule 02.06.2015
comment
Все структуры неявно наследуются от System.ValueType, поэтому вы не видите его в декомпилированном C#. Посмотрите на ИЖ и он там есть.   -  person Mike Zboray    schedule 02.06.2015
comment
@Servy: упс.. это была моя ошибка.. я отредактировал пост   -  person Raghav    schedule 02.06.2015
comment
Почему здесь не был выбран интерфейс? Потому что System.Object реализует определенные вещи. Interfaces на самом деле ничего не может реализовать. Вы заметили, что при объявлении класса вам не требуется указывать реализацию .Equals? Потому что System.Object уже предоставляет один. Если бы C# заставил меня указать свой собственный метод .Equals для всего (из-за плохого выбора interface), я бы разработал свой собственный abstract class, который все могло бы наследовать, который уже предоставлял бы такие вещи.   -  person Der Kommissar    schedule 02.06.2015
comment
Интерфейсы — это контракты, просто воздух, пока они не будут реализованы. System.Object является структурным, он играет важную роль в среде CLR. Заголовок объекта важен, это то, что общего у всех типов .NET. Также служит заполнителем для освобожденных объектов в куче GC. Объявления структур, которые вы найдете для типов значений, соответствуют только упакованной версии значения, их неупакованное представление сильно отличается и сильно привязано к процессору.   -  person Hans Passant    schedule 02.06.2015


Ответы (1)


У вас много вопросов в этом вопросе. В будущем рассмотрите возможность публикации одного вопроса на вопрос.

Для чего нужен System.Object?

Вопрос нечеткий. Позвольте мне перефразировать.

Почему система типов C# была разработана таким образом, чтобы все типы, не являющиеся указателями, имели общий базовый тип?

Чтобы получить преимущества полиморфизма. В системе типов, не имеющей обобщений, например в системе типов C# 1.0, вы хотите иметь возможность составить список произвольных объектов.

Почему интерфейс не был предпочтительнее, чем тип класса?

Интерфейсы определяют возможности. Базовые классы допускают общую реализацию. Методы Object имеют реализации, общие для производных типов.

Я предполагаю, что у него есть только 2 прямых дочерних элемента (игнорируя, что мы можем создать больше), а именно System.ValueType и System.ReferenceType, которые имеют совершенно разные реализации.

Это совершенно неверно.

Таким образом, System.Object может понадобиться для обработки основных функций CLR, таких как создание объекта с использованием new().

No.

применение конструктора по умолчанию

Нет. Хотя это правда, что в конечном итоге вызывается конструктор объекта по умолчанию, этот конструктор ничего не делает. Так что говорить о том, что целью типа является обеспечение вызова конструктора, который ничего не делает, — это странно.

ГК и т.д.?

No.

Когда я декомпилирую System.dll и вижу реализацию bool, я вижу только структуру.

Правильный. Предполагается, что вы знаете, что все структуры, не являющиеся перечислениями, не допускающие значения NULL, наследуются непосредственно от System.ValueType.

Для класса (скажем, Exception) я не вижу наследования System.ReferenceType или System.Object.

Правильный. Предполагается, что вы знаете, что все типы классов наследуются от System.Object (если, конечно, не указан другой тип).

Как обрабатывается это наследство?

Вопрос слишком расплывчатый, чтобы на него ответить.

что система общего типа делает с MyCustomClass, чтобы он наследовал от System.Object (поскольку наследование определяется во время компиляции, я думаю, что CTS делает это)

Я совершенно не понимаю, о чем вы пытаетесь здесь спросить. Попробуйте уточнить вопрос.

Вопрос, который вы не задали, но, вероятно, должны были задать:

Что я имею в виду, когда говорю, что тип A наследуется от типа B?

Это означает, что все члены типа B также являются членами типа A.

Все члены? Даже частные члены?

да. Наследование — это свойство, согласно которому члены одного типа также являются членами другого.

person Eric Lippert    schedule 02.06.2015
comment
Если я могу догадаться о цели последнего фактического вопроса, я бы подумал, что OP означает, как/когда/где компилятор/JIT/CTS/CLR определяет мой класс как наследуемый от object, если я не указать другой базовый класс? - person D Stanley; 17.06.2015