.NET Primitive und Typhierarchien, warum wurde es so gestaltet?
Frage
Ich würde gerne verstehen, warum es auf .NET neun Ganzzahltypen gibt: Char
, Byte
, SByte
, Int16
, UInt16
, Int32
, UInt32
, Int64
, und UInt64
; plus andere numerische Typen: Single
, Double
, Decimal
; Und all diese Typen haben überhaupt keine Beziehung.
Als ich anfing, in C zu codieren, dachte ich "cool, es gibt a uint
Typ, ich werde das verwenden, wenn negative Werte nicht zulässig sind ". Dann wurde mir klar, dass keine API verwendet wurde uint
aber int
Stattdessen und das uint
ist nicht abgeleitet von int
, Es war also eine Umstellung erforderlich.
Was sind die reale Anwendung dieser Typen? Warum nicht stattdessen, haben Sie stattdessen, integer
und positiveInteger
? Dies sind Typen, die ich verstehen kann. Das Alter einer Person in Jahren ist a positiveInteger
, und da positiveInteger
ist eine Teilmenge von integer
Es ist so erforderlich, wann immer integer
wird erwartet.
Das Folgende ist ein Diagramm der Typhierarchie in XPath 2.0 und XQuery 1.0. Wenn Sie unter schauen xs:anyAtomicType
Sie können die numerische Hierarchie sehen decimal
> integer
> long
> int
> short
> byte
. Warum wurde .NET nicht so gestaltet? Wird das neue Framework "Oslo" anders sein?
Lösung
Meine Vermutung wäre, weil die zugrunde liegende Hardware diese Klassenhierarchie bricht. Es gibt (vielleicht überraschend) oft, wenn Sie das interessieren, dass a UInt32
ist ein 4 Bytes groß und unsigniert, also a UInt32
ist nicht eine Art von Int32
, noch ist ein Int32
Eine Art von Int64
.
Und Sie kümmern sich fast immer um den Unterschied zwischen einem int
und ein float
.
Grundsätzlich sind Vererbung und die Klassenhierarchie nicht dasselbe wie die mathematische Einbeziehung. Die Tatsache, dass die Werte a UInt32
kann halten eine strenge Teilmenge der Werte a Int64
kann halten, bedeutet nicht, dass a UInt32
ist eine Art von Art von Int64
. Weniger offensichtlich, und Int32
ist keine Art von Int64
- Obwohl es keinen konzeptionellen Unterschied zwischen ihnen gibt, sind ihre zugrunde liegenden Darstellungen unterschiedlich (4 Bytes gegenüber 8 Bytes). Decimals
sind noch unterschiedlicher.
XPath ist unterschiedlich: Die Darstellungen für alle numerischen Typen sind im Grunde gleich - eine Reihe von ASCII -Ziffern. Dort der Unterschied zwischen a short
und ein long
ist einer von möglich Reichweite und nicht Repräsentation - "123" ist beide eine gültige Darstellung von a short
und eine gültige Darstellung von a long
mit dem gleichen Wert.
Andere Tipps
Dezimales ist für Berechnungen bestimmt, die Präzision benötigen (im Grunde genommen Geld). Siehe hier: http://msdn.microsoft.com/en-us/library/364x0z75(vs.80).aspx
Singles/Doppel unterscheiden sich von Dezimalstellen, da sie eine Annäherung sein sollen (im Grunde genommen für wissenschaftliche Berechnungen).
Deshalb sind sie nicht verwandt.
Was Bytes und Chars betrifft, sind sie völlig anders: Ein Byte ist 0-255, während ein Zeichen ein Charakter ist und daher Unicode-Charaktere speichern kann (es gibt viel mehr als 255 davon!)
UINTs und INTs konvertieren nicht automatisch, da sie jeweils für den anderen Werte speichern können (UINTs haben doppelt so hoch wie die positive Auswahl an INTs).
Sobald Sie den Dreh raus haben, macht es tatsächlich viel Sinn.
Was Ihr Alter betrifft, ich würde einfach ein int verwenden;)