Почему десятичный не примитивный тип?
Почему decimal
не примитивный тип?
Console.WriteLine(typeof(decimal).IsPrimitive);
выводит false
.
Это базовый тип, это часть спецификаций языка, но не примитив. Какие примитивные типы представляют < <20 > в рамках? Например, int
имеет поле m_value
типа int
. A double
имеет поле m_value
типа double
. Это не относится к decimal
. Кажется, он представлен связкой int
, но я не уверен.
Почему это выглядит как примитивный тип, ведет себя как примитивный тип (кроме несколько случаев), но не является примитивным типом?
Ответы
Ответ 1
Хотя не прямой ответ, в документации для IsPrimitive
перечислены типы примитивов:
http://msdn.microsoft.com/en-us/library/system.type.isprimitive.aspx
Здесь был задан аналогичный вопрос:
http://bytes.com/topic/c-sharp/answers/233001-typeof-decimal-isprimitive-false-bug-feature
Ответ цитируется у Джона Скита:
CLR не должен обладать никакими внутренними знаниями о десятичной type - он рассматривает это как другой тип значения, который перегруженных операторов. Нет никаких инструкций IL для прямой работы например, на десятичных знаках.
Мне кажется, что decimal
- это тип, который должен существовать для языка/среды выполнения, желающей быть CLS/CLI-совместимым (и поэтому называется "примитивным", потому что это базовый тип с поддержкой ключевых слов), но фактическая реализация не требует, чтобы он был действительно "примитивным" (как в CLR, он не считает, что это примитивный тип данных).
Ответ 2
Decimal - это 128-битный тип данных, который не может быть представлен изначально на компьютерном оборудовании. Например, 64-разрядная компьютерная архитектура обычно имеет регистры с целыми числами и адресами, которые имеют ширину 64 бита, что позволяет напрямую поддерживать 64-битные типы данных и адреса.
Википедия говорит, что
В зависимости от языка и его реализации примитивные типы данных может иметь или не иметь взаимно однозначное соответствие объектам в память компьютера. Однако обычно ожидают операции по основным примитивные типы данных являются самыми быстрыми языковыми конструкциями.
В случае десятичного числа это всего лишь сложный тип данных, который использует целые числа внутри, поэтому его производительность медленнее, чем типы данных, которые имеют прямую корреляцию с памятью компьютера (ints, double и т.д.).
Ответ 3
Рассмотрим приведенный ниже пример,
int i = 5;
float f = 1.3f;
decimal d = 10;
Если вы поместите отладчик и проверите собственный набор инструкций, это будет
![введите описание изображения здесь]()
Как вы можете видеть int, float, все, являющиеся примитивным типом, берут одну команду для выполнения операции assignemnt, тогда как decimal, string примитивные типы принимают более одной нативной инструкции для выполнения этой операции.