.NET примитивы и иерархии типов, почему это было разработано именно так?
Вопрос
Я хотел бы понять, почему в .NET существует девять целочисленных типов: Char
, Byte
, SByte
, Int16
, UInt16
, Int32
, UInt32
, Int64
, и UInt64
;плюс другие числовые типы: Single
, Double
, Decimal
;и все эти типы не имеют никакого отношения вообще.
Когда я впервые начал кодировать на C #, я подумал: "круто, есть uint
введите, я собираюсь использовать это, когда отрицательные значения недопустимы ".Тогда я понял, что никакой API не используется uint
но int
вместо этого, и это uint
не является производным от int
, поэтому потребовалось преобразование.
Каково реальное применение этих типов в реальном мире?Почему бы не иметь, вместо этого, integer
и positiveInteger
?Это типы, которые я могу понять.Возраст человека в годах - это positiveInteger
, и поскольку positiveInteger
является подмножеством integer
существует такая потребность в преобразовании всякий раз, когда integer
ожидается.
Ниже приведена схема иерархии типов в XPath 2.0 и XQuery 1.0.Если вы заглянете под xs:anyAtomicType
вы можете увидеть числовую иерархию decimal
> integer
> long
> int
> short
> byte
.Почему .NET не был разработан таким образом?Будет ли новая структура "Осло" чем-то отличаться?
Решение
Мое предположение было бы связано с тем, что базовое оборудование нарушает эту иерархию классов.Бывает (возможно, удивительно) много случаев, когда вас волнует, что UInt32
является размером в 4 байта и без знака, так что UInt32
не является своего рода Int32
, также не является Int32
тип из Int64
.
И вы почти всегда заботитесь о разнице между int
и a float
.
По сути, наследование и иерархия классов - это не то же самое, что включение математического набора.Тот факт , что значения a UInt32
может содержать строгое подмножество значений, Int64
может удерживать не означает, что UInt32
является одним из видов Int64
.Менее очевидно, что Int32
это не тип Int64
- несмотря на то, что между ними нет концептуальной разницы, их базовые представления различны (4 байта против 8 байт). Decimals
они еще более разные.
XPath - это другое:представления для всех числовых типов принципиально одинаковы - строка цифр ASCII.Там разница между short
и a long
является одним из возможно диапазон, а не представление - "123" является одновременно допустимым представлением short
и действительное представление о long
с тем же значением.
Другие советы
Decimal предназначен для вычислений, требующих точности (в основном, денег).Смотрите здесь: http://msdn.microsoft.com/en-us/library/364x0z75 (ПРОТИВ 80).aspx
Одиночные / парные числа отличаются от десятичных, потому что они предназначены для аппроксимации (в основном, для научных расчетов).
Вот почему они не связаны.
Что касается байтов и символов, то они совершенно разные:байт равен 0-255, тогда как символ char является символом и, следовательно, может хранить символы юникода (их намного больше, чем 255!).
Значения Uints и ints не преобразуются автоматически, поскольку каждое из них может сохранять значения, которые невозможны для другого (значения uints имеют в два раза больший положительный диапазон значений ints).
Как только вы освоитесь со всем этим, это действительно обретет большой смысл.
Что касается вашего возраста, я бы просто использовал int ;)