Система типов CLR - PullRequest
       15

Система типов CLR

1 голос
/ 04 марта 2020

Я был сбит с толку, читая книгу "CLR via C#" (глава "Основы типа"), в которой говорится, что тип объекта некоторого объекта базового типа (например, class Employee { }) равен System.Type а также то, что метод GetType фактически возвращает указатель на объект типа объекта (который обеспечивает наследование типа), поэтому он звучит так, как будто System.Type является самым базовым типом объекта, к которому относятся все объекты типа (а указатель типа System.Type ссылается на сам). Но с другой стороны, все типы наследуются от System.Object , и на практике, например, это выражение typeof(Employee).BaseType возвращает System.Object (не System.Type!). Так может кто-нибудь объяснить, где указатель объекта типа на самом деле ссылается? System.Type или System.Object?

          System.Object
           /         \ 
      Employee     System.Reflection.MemberInfo
                               \
                           System.Type

EDIT

Благодаря Jona sH, который предоставил ответ. Я также нарисовал схему, которая помогла мне понять это визуально:

enter image description here

Ответы [ 2 ]

1 голос
/ 04 марта 2020

объект типа некоторого объекта базового типа (например, класс Employee {}) имеет тип System.Type

Это верно, но несколько сбивает с толку, Объект типа любой объект имеет тип System.Type.

Метод GetType фактически возвращает указатель на объект типа объекта

Также true. Мы называем это ссылкой, а не указателем, но это техническая сложность.

, поэтому звучит так, будто System.Type - это объект самого базового типа, к которому относятся все объекты типа.

Это не следует за предыдущими утверждениями. System.Object - это самый базовый объект, из которого происходят все остальные объекты. System.Type является объектом, как и любой другой, поэтому он является производным от System.Object. Как на вашей иллюстрации.

Подобные обсуждения могут немного запутать. Крайне важно различать guish между типом объекта, т.е. Employee, и типом объекта для указанного объекта, т. Е. System.Type.

. Рассмотреть это с точки зрения языкового дизайна. Полезно иметь базовый тип, от которого происходят все объекты, чтобы программист мог обходить систему типов при необходимости, и иметь некоторые базовые c методы, такие как ToString и GetHashcode. Также полезно позволить программисту инспектировать и напрямую работать с системой типов языка. Мы называем это «отражением». System.Type является частью этой системы, она описывает информацию о типе объектов. Но это так же, как и любой другой тип, поэтому он должен быть производным от System.Object.

0 голосов
/ 04 марта 2020

Делегат

Свойство BaseType класса Type возвращает класс, от которого наследуется тип. Так, в случае System.Delegate, BaseType будет иметь тип System.Object, потому что, если вы читаете документацию System.Delegate, он напрямую наследуется от System.Object. Каждый класс в C# наследуется от System.Object, даже если не напрямую.

Как видно из приведенной выше ссылки, System.Delegate реализует ICloneable, System.Runtime.Serialization.ISerializable. Последние два являются интерфейсами, поэтому они не считаются расширенными классами. Таким образом, неявно, он наследует непосредственно System.Object.

...