primitives .NET et les hiérarchies de type, pourquoi at-il été conçu comme ça?

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

  •  16-09-2019
  •  | 
  •  

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?

text alt

Était-ce utile?

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;)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top