primitives .NET et les hiérarchies de type, pourquoi at-il été conçu comme ça?
Question
Je voudrais comprendre pourquoi .NET il y a neuf types entiers: Char
, Byte
, SByte
, Int16
, UInt16
, Int32
, UInt32
, Int64
et UInt64
; ainsi que d'autres types numériques: Single
, Double
, Decimal
; et tous ces types ont aucune relation.
Quand je commencé à coder en C # Je pensais que « cool, il y a un type de uint
, je vais utiliser que lorsque les valeurs négatives ne sont pas autorisés ». Puis j'ai réalisé aucune API utilisé uint
mais int
à la place, et que uint
ne provient pas de int
, donc une conversion était nécessaire.
Quels sont les application réelle de ces types? Pourquoi ne pas avoir, à la place, integer
et positiveInteger
? Ce sont des types que je peux comprendre. est un positiveInteger
, et depuis positiveInteger
est un sous-ensemble de integer
il a besoin donc pour la conversion chaque fois integer
devrait l'âge dans les années d'une personne.
Ce qui suit est un schéma de la hiérarchie du type dans XPath 2.0 et XQuery 1.0. Si vous regardez sous xs:anyAtomicType
vous pouvez voir la hiérarchie numérique decimal
> integer
> long
> int
> short
> byte
. Pourquoi ne .NET conçu comme ça? le nouveau cadre « Oslo » différent?
La solution
Je dirais parce que le matériel sous-jacent casse la hiérarchie des classes. Il y a (peut-être surprenant) plusieurs fois lorsque vous souciez qu'un UInt32
est un 4 octets grand et non signé, donc un UInt32
est pas une sorte de Int32
, ni un Int32
un type de Int64
.
Et vous souciez presque toujours sur la différence entre un int
et un float
.
Fondamentalement, l'héritage et la hiérarchie des classes ne sont pas les mêmes que l'inclusion mathématique définie. Le fait que les valeurs d'un UInt32
peut contenir sont un sous-ensemble strict des valeurs d'un Int64
peut contenir ne signifie pas qu'un UInt32
est un type de Int64
. Moins de toute évidence, un Int32
n'est pas un type de Int64
- même si il n'y a pas de différence conceptuelle entre eux, leurs représentations sous-jacentes sont différentes (4 octets et 8 octets). Decimals
sont encore plus différents.
XPath est différent: les représentations de tous les types numériques sont fondamentalement les mêmes - une chaîne de chiffres ASCII. Là-bas, la différence entre un short
et un long
est l'un des possible plage plutôt que la représentation -. « 123 » est à la fois une représentation valide d'une short
et une représentation valide d'un long
avec la même valeur
Autres conseils
décimal est destiné à des calculs qui ont besoin de précision (en gros, l'argent). Voir ici: http://msdn.microsoft.com/ fr-fr / bibliothèque / 364x0z75 (VS.80) .aspx
simple / double sont différentes de décimales, car ils sont destinés à être une approximation (essentiellement, pour les calculs scientifiques).
C'est la raison pour laquelle ils ne sont pas liés.
En ce qui concerne les octets et les caractères, ils sont tout à fait différent: un octet est 0-255, alors qu'un caractère est un caractère, et peut donc stocker les caractères unicode (! Il y a beaucoup plus de 255 d'entre eux)
uints et ints font, car ils peuvent chacun stocker des valeurs qui ne sont pas convertir automatiquement impossible pour les autres (uints ont deux fois la portée positive de ints).
Une fois que vous obtenez le coup de tout cela, il ne fait faire beaucoup de sens.
En ce qui concerne votre truc âges, je voudrais simplement utiliser un int;)