2009-08-31 2 views
5

.NET у нас есть примитивные типы данных, такие как типы int и значения типа struct.Как .NET отличает ссылки от примитивных и типов значений

А также у нас есть ссылочные типы. Все они, по-видимому, получены из класса объектов.

Как .NET определяет примитив, тип значения в отношении ссылочного типа?

Где это делается? У компилятора или у JIT?

Это относится к возможностям компиляторов?

+0

Извините, но я не совсем понимаю ваш вопрос. –

ответ

11

Все типы значений, в том числе встроенные примитивы Common Type System (CTS), получают ПРЯМОГО из типа CTS «System.ValueType» (кроме перечислений).

Таким образом, компилятор может определить, изучая базовый тип любого типа. Если это «System.ValueType», то это тип значения, в противном случае это ссылочный тип.

Edit: Перечисления, как в

public Enum Shipper {FedEx, Aerborne, USPS, Stork} 

... не получают непосредственно из System.ValueType, они вытекают из System.Enum, который вытекает из System.ValueType ...

+0

За исключением 'System.Enum', который происходит из' System.ValueType', но не является типом значения. Но все типы 'enum' * являются * значениями типов, которые производятся от' System.Enum', делая их базовый тип не 'System.ValueType'. Таким образом, типы значений - это типы, полученные из 'System.ValueType', за исключением' System.Enum', хотя внутренняя реализация этого теста может быть выполнена более эффективно, чем это. –

+0

Спасибо Чарльз. Работает ли Java аналогично? – 2009-08-31 18:28:31

+0

@ 280Z28: Я не уверен, что это значит, поскольку System.Enum - это не тот тип, который вы можете использовать напрямую. Фактически, это даже не достаточно реально для использования в качестве ограничения для общего типа (см. Ниже http://msdn.microsoft.com/en-us/library/d5x73970.aspx). –

2

Типы значений на самом деле получены из System.ValueType, который сам является производным от System.Object.

2

Value типы производны от System.ValueType, что, помимо прочего, дает стандартную (но медленную) реализацию GetHashCode и Equals. (Они медленны, потому что они используют отражение).

Примитивные типы, такие как int, могут быть помещены в типы значений в ИЛ, используя инструкцию box. У них есть специальные инструкции для работы с ними.

Референтные типы - это все другие классы.

Есть также указатели, которые могут использоваться в коде unsafe и не относятся к object. EDIT - proof.

+0

Вы уверены, что типы указателей не являются производными от IntPtr? –

+0

Да, они совершенно не связаны. Во-первых, «IntPtr» является структурой, и вы не можете получить структуру. – SLaks

Смежные вопросы