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?

alt text

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top