.NET примитивы и иерархии типов, почему это было разработано именно так?

StackOverflow https://stackoverflow.com/questions/1678068

  •  16-09-2019
  •  | 
  •  

Вопрос

Я хотел бы понять, почему в .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 не был разработан таким образом?Будет ли новая структура "Осло" чем-то отличаться?

alt text

Это было полезно?

Решение

Мое предположение было бы связано с тем, что базовое оборудование нарушает эту иерархию классов.Бывает (возможно, удивительно) много случаев, когда вас волнует, что 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 ;)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top