2009-11-05 5 views
6

Ich möchte auf .NET verstehen, warum es neun Integer-Typen sind: 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..NET-Primitive und Typhierarchien, warum wurde es so entworfen?

Als ich anfing, in C# zu programmieren, dachte ich "cool, es gibt einen uint Typ, ich werde das verwenden, wenn negative Werte nicht erlaubt sind". Dann realisierte ich keine API uint sondern int stattdessen, und dass uint ist nicht von int abgeleitet, so dass eine Konvertierung benötigt wurde.

Was sind die realen Anwendungen dieser Typen? Warum haben Sie statt dessen integer und positiveInteger? Das sind Typen, die ich verstehen kann. Das Alter einer Person in Jahren ist ein positiveInteger, und da positiveInteger ist eine Teilmenge von integer gibt es so Notwendigkeit für die Konvertierung, wann immer integer erwartet wird.

Im Folgenden finden Sie ein Diagramm der Typhierarchie in XPath 2.0 und XQuery 1.0. Wenn Sie unter xs:anyAtomicType suchen, können Sie die numerische Hierarchie decimal>integer>long>int>short>byte sehen. Warum wurde .NET nicht so entworfen? Wird der neue Rahmen "Oslo" anders sein?

alt text

+0

Über Uint nicht in APIs, werfen Sie einen Blick auf die CLS. http://msdn.microsoft.com/en-us/library/12a7a7h3.aspx – Dykam

Antwort

4

Meine Vermutung wäre, da die zugrunde liegende Hardware, die Klassenhierarchie bricht. Es gibt (vielleicht überraschend) viele Male, wenn Sie darauf achten, dass ein UInt32 ist ein 4 Byte groß und unsigniert, so dass ein UInt32ist nicht eine Art Int32, noch ist ein Int32 eine Art Int64.

Und Sie kümmern sich fast immer um den Unterschied zwischen einem int und einem float.

Grundsätzlich Vererbung & die Klassenhierarchie sind nicht das gleiche wie mathematische Set Inclusion. Die Tatsache, dass die Werte a UInt32 halten können, sind eine strenge Teilmenge der Werte, die ein Int64 halten kann, bedeutet nicht, dass ein UInt32 ein Typ Int64 ist. Weniger offensichtlich ist ein Int32 kein Typ 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 anders: Die Darstellungen für alle numerischen Typen sind grundsätzlich gleich - eine Folge von ASCII-Ziffern. Dort ist der Unterschied zwischen einer short und einer möglichen Bereich statt Darstellung - "123" ist sowohl eine gültige Darstellung einer short als auch eine gültige Darstellung einer long mit dem gleichen Wert.

+0

können Sie auf 'zugrundeliegende Hardware bricht diese Klassenhierarchie' ? –

+0

Konzeptionell ist die Hierarchie in Ihrem Diagramm korrekt - ein Byte ist eine Teilmenge von short ist eine Teilmenge von int usw. Dies funktioniert für XPath, da es sich um XML handelt, wobei der Wert 123 durch das Byte "123" dargestellt werden könnte , die kurze "123" oder die lange "123" - die Darstellungen sind genau gleich. Hier ist der Typ eine Einschränkung für die möglichen Werte, ändert jedoch nicht die Darstellung. Für C# kann der Wert 123 im Speicher als das Byte dargestellt werden, 0111 1011, die kurze 0000 0000 0111 1011, der Int ... Diese Darstellungen haben eine andere Größe, und die Hardware muss sich darum kümmern. – RAOF

+0

Ich verstehe. Warum brauchen wir dann andere Darstellungen? Ist es, Programme effizienter zu machen? –

3

Decimal wird für die Berechnungen bestimmt, die Präzision benötigen (im Grunde, Geld). Siehe hier: http://msdn.microsoft.com/en-us/library/364x0z75(VS.80).aspx

Singles/Doubles unterscheiden sich von Dezimalzahlen, da sie eine Näherung darstellen (im Grunde für wissenschaftliche Berechnungen).

Deshalb sind sie nicht verwandt.

Wie für Bytes und Zeichen, sind sie ganz anders: ein Byte 0-255 ist, während ein Zeichen ein Zeichen ist, und somit Unicode-Zeichen gespeichert werden kann (es gibt von ihnen viel mehr als 255!)

Uints und Ints werden nicht automatisch konvertiert, da sie jeweils Werte speichern können, die für den anderen unmöglich sind (uints haben den doppelten positiven Bereich von ints).

Sobald Sie den Dreh raus haben, macht es tatsächlich viel Sinn.

Was Ihr Alter Sache, ich würde einfach ein int verwenden;)

+0

Ich verstehe, warum diese numerischen Typen nicht verwandt sind, meine Frage ist, warum wurde .NET so entworfen? Ich fange an zu denken, dass es für die Kompatibilität mit RDBMS ist. Benutzt du Uint in deinen Apps? –

+3

Hatte nie die Notwendigkeit, Uint persönlich zu verwenden. Und wenn Sie sich jemals fragen: Warum wurde Feature X in .net so entworfen? Die übliche Antwort ist "weil es in Java so ist";) – Chris

+1

Ein Grund dafür, dass int oft über uint verwendet wird, ist, dass uint nicht mit der Common Language Specification kompatibel ist. – porges

Verwandte Themen