Как.NET дифференцирует ссылку по сравнению с типами значения и примитивным

С Потоковым API Java 8 можно сделать что-то вроде этого:

Stream
    .of(throwable.getStackTrace())
    .map(StackTraceElement::toString)
    .collect(Collectors.joining("\n"));

Это возьмет массив элементов трассировки стека, преобразует их, чтобы представить в виде строки и присоединиться в многострочную строку.

5
задан abatishchev 14 June 2010 в 13:35
поделиться

3 ответа

Все типы значений, включая встроенные примитивы системы общих типов (CTS), НАПРЯМУЮ наследуются от типа CTS "System.ValueType" (кроме перечислений).

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

Изменить: перечисления, как в

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

... не являются производными непосредственно от System.ValueType, они являются производными от System .Enum, производный от System.ValueType ...

11
ответ дан 18 December 2019 в 11:59
поделиться

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

2
ответ дан 18 December 2019 в 11:59
поделиться

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

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

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

Существуют также указатели, которые могут использоваться в небезопасном коде и не являются производными от объекта вообще. РЕДАКТИРОВАТЬ - доказательство .

2
ответ дан 18 December 2019 в 11:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: