2009-11-05 10 views
6

me gustaría entender por qué en .NET existen nueve tipos de enteros: Char, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64 y UInt64; más otros tipos numéricos: Single, Double, Decimal; y todos estos tipos no tienen ninguna relación.Primitivas .NET y jerarquías de tipos, ¿por qué fue diseñado así?

Cuando empecé a codificar en C#, pensé "genial, hay un tipo uint, lo voy a usar cuando los valores negativos no estén permitidos". Entonces me di cuenta de que ninguna API usaba uint sino int, y que uint no se derivaba de int, por lo que era necesaria una conversión.

¿Cuál es la aplicación en el mundo real de estos tipos? ¿Por qué no tener, en cambio, integer y positiveInteger? Estos son tipos que puedo entender. La edad de una persona en años es positiveInteger, y dado que positiveInteger es un subconjunto de integer, existe la necesidad de conversión siempre que se espere integer.

El siguiente es un diagrama de la jerarquía de tipos en XPath 2.0 y XQuery 1.0. Si mira debajo de xs:anyAtomicType, puede ver la jerarquía numérica decimal>integer>long>int>short>byte. ¿Por qué no se diseñó .NET así? ¿Será el nuevo marco "Oslo" diferente?

alt text

+0

Acerca de uint no en API, eche un vistazo a la CLS. http://msdn.microsoft.com/en-us/library/12a7a7h3.aspx – Dykam

Respuesta

4

Mi conjetura sería porque el hardware subyacente rompe esa jerarquía de clases. Hay (quizás sorprendentemente) muchas veces cuando te importa que un UInt32 es un 4 bytes grande y sin firmar, por lo que un UInt32no es un tipo de Int32, ni es un Int32 un tipo de Int64.

Y casi siempre le importa la diferencia entre int y float.

Fundamentalmente, la herencia & la jerarquía de clases no es lo mismo que la inclusión del conjunto matemático. El hecho de que los valores que UInt32 pueden contener es un subconjunto estricto de los valores que Int64 puede contener, no significa que UInt32 es un tipo de Int64. Menos obviamente, un Int32 no es un tipo de Int64 - aunque no hay diferencia conceptual entre ellos, sus representaciones subyacentes son diferentes (4 bytes versus 8 bytes). Decimals son aún más diferentes.

XPath es diferente: las representaciones para todos los tipos numéricos son fundamentalmente las mismas: una cadena de dígitos ASCII. Allí, la diferencia entre short y long es uno de posible en lugar de representación - "123" es una representación válida de short y una representación válida de long con el mismo valor.

+0

¿Puede explicar en más detalle 'las rupturas de hardware subyacentes que la jerarquía de clases'? ? –

+0

Conceptualmente, la jerarquía en el diagrama es correcta: un byte es un subconjunto de short es un subconjunto de int, etc. Esto funciona para XPath, ya que se trata de XML, donde el valor 123 podría representarse con el byte "123" , el corto "123", o el largo "123" - las representaciones son exactamente las mismas. Aquí, el tipo es una restricción en los valores posibles, pero no cambia la representación. Para C#, el valor 123 se puede representar en la memoria como el byte, 0111 1011, el corto 0000 0000 0111 1011, el int ... Estas representaciones son de un tamaño diferente, y el hardware tiene que preocuparse por eso. – RAOF

+0

Ya veo. Entonces, ¿por qué necesitamos diferentes representaciones? ¿Es para hacer que los programas sean más eficientes? –

3

decimal está destinado para los cálculos que requieren precisión (básicamente, el dinero). Ver aquí: http://msdn.microsoft.com/en-us/library/364x0z75(VS.80).aspx

Singles/Dobles son diferentes a los decimales, porque están destinados a ser una aproximación (básicamente, para cálculos científicos).

Es por eso que no están relacionados.

En cuanto a bytes y caracteres, son totalmente diferentes: un byte es 0-255, mientras que un char es un carácter, y por lo tanto puede almacenar caracteres Unicode (hay un montón más de 255 de ellos!)

Uints y ints no se convierten automáticamente, ya que cada uno puede almacenar valores que son imposibles para el otro (los uints tienen el doble del rango positivo de ints).

Una vez que lo dominas, en realidad tiene mucho sentido.

cuanto a su cosa edades, yo diría simplemente utilizar un int;)

+0

Entiendo por qué estos tipos numéricos no están relacionados, mi pregunta es, ¿por qué se diseñó .NET así? Estoy empezando a pensar que es por compatibilidad con RDBMS. ¿Usas uint en tus aplicaciones? –

+3

Nunca tuve la necesidad de usar uint personalmente. Y si alguna vez te preguntas, ¿por qué la función X en .NET fue diseñada así? la respuesta habitual es 'porque es así en Java';) – Chris

+1

Una razón por la que int se usa a menudo sobre uint es que uint no cumple con la especificación de lenguaje común. – porges

Cuestiones relacionadas