primitive e tipo gerarchie .NET, perché è stato progettato come questo?
Domanda
Vorrei capire perché il .NET ci sono nove tipi interi: Char
, Byte
, SByte
, Int16
, UInt16
, Int32
, UInt32
, Int64
e UInt64
; più altri tipi numerici: Single
, Double
, Decimal
; e tutti questi tipi non hanno alcuna relazione a tutti.
Quando ho iniziato la codifica in C # ho pensato "fresco, c'è un tipo di uint
, ho intenzione di utilizzare che quando i valori negativi non sono ammessi". Poi realizzai alcuna API utilizzato uint
ma int
invece, e che uint
non deriva da int
, quindi era necessaria una conversione.
Quali sono l'applicazione reale mondo di questi tipi? Perché non hanno, invece, integer
e positiveInteger
? Questi sono i tipi che posso capire. L'età di una persona in anni è un positiveInteger
, e dal momento che positiveInteger
è un sottoinsieme di integer
c'è così bisogno di conversione ogni volta che si prevede integer
.
Il seguente è un diagramma della gerarchia tipo in XPath 2.0 e XQuery 1.0. Se si guarda sotto xs:anyAtomicType
è possibile vedere la gerarchia numerica decimal
> integer
> long
> int
> short
> byte
. Perché non è stato .NET progettato come questo? Sarà il nuovo quadro "Oslo" dovrebbe essere diverso?
Soluzione
La mia ipotesi è perché l'hardware sottostante rompe quella gerarchia di classe. Ci sono (forse sorprendentemente) molte volte quando si cura che un UInt32
è un 4 byte grande e non firmato, quindi un UInt32
non è una sorta di Int32
, né è un Int32
un tipo di Int64
.
E che ti interessano quasi sempre circa la differenza tra un int
e float
.
In sostanza, l'ereditarietà e la gerarchia di classe non sono gli stessi set di inclusione matematica. Il fatto che i valori di UInt32
può contenere sono un sottoinsieme rigoroso dei valori una Int64
può contenere non significa che un UInt32
è un tipo di Int64
. Meno ovviamente, un Int32
non è un tipo di Int64
- anche se non c'è alcuna differenza concettuale tra loro, le loro rappresentazioni sottostanti sono differenti (4 byte contro 8 byte). Decimals
sono ancora più diverso.
XPath è diverso: le rappresentazioni per tutti i tipi numerici sono fondamentalmente gli stessi - una stringa di cifre ASCII. Lì, la differenza tra un short
e long
è uno dei possibile gamma piuttosto che la rappresentazione -. "123" è sia una rappresentazione valida di una short
e una rappresentazione valida di una long
con lo stesso valore
Altri suggerimenti
decimale è destinato per i calcoli che hanno bisogno di precisione (in pratica, il denaro). Vedi qui: http://msdn.microsoft.com/ it-it / library / 364x0z75 (VS.80) aspx
singole / doppie sono diversi per decimali, perché sono destinati ad essere un'approssimazione (in pratica, per i calcoli scientifici).
È per questo che non sono correlati.
Per quanto riguarda i byte e caratteri, sono totalmente diversi: un byte è 0-255, mentre un char è un personaggio, e può quindi memorizzare i caratteri Unicode (ci sono molto di più di 255 di loro)
uints e interi non convertire automaticamente, perché possono ciascuno memorizzare i valori che sono impossibili per gli altri (uints avere il doppio della portata positiva di int).
Una volta a ottenere il blocco di tutto, lo fa effettivamente fare un sacco di senso.
Per quanto riguarda la tua età cosa, mi piacerebbe semplicemente utilizzare un int;)