primitivas y las jerarquías de tipo .NET, ¿por qué fue diseñado de esta manera?

StackOverflow https://stackoverflow.com/questions/1678068

  •  16-09-2019
  •  | 
  •  

Pregunta

Me gustaría entender por qué en .NET existen nueve tipos de enteros: Char, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64 y UInt64; además de otros tipos numéricos: Single, Double, Decimal; y todos estos tipos no tienen ninguna relación en absoluto.

Cuando empecé codificación en C # pensé "fresco, hay un tipo uint, voy a utilizar que cuando los valores negativos no están permitidos". Entonces me di cuenta no API utiliza uint pero int su lugar, y que uint no se deriva de int, por lo que se necesitaba una conversión.

¿Cuáles son las aplicaciones reales de estos tipos? ¿Por qué no tienen, en cambio, integer y positiveInteger? Estos son los tipos que puedo entender. La edad de una persona en un año es positiveInteger, y desde positiveInteger es un subconjunto de integer no es tan necesario para la conversión cada vez que se espera que integer.

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

text alt

¿Fue útil?

Solución

Mi conjetura sería porque el hardware subyacente rompe esa jerarquía de clases. Hay (quizás sorprendentemente) muchos momentos en los que se preocupan de que una UInt32 es un 4 bytes grande y sin firmar, por lo que un UInt32 no es una especie de Int32, ni es un Int32 un tipo de Int64.

Y casi siempre se preocupa por la diferencia entre un int y una float.

Fundamentalmente, la herencia y la jerarquía de clases no son los mismos que la inclusión conjunto matemático. El hecho de que los valores de un UInt32 puede contener son un subconjunto estricto de los valores de una Int64 puede contener no significa que un UInt32 es un tipo de Int64. De manera menos obvia, un Int32 no es un tipo de Int64 - a pesar de que no hay diferencia conceptual entre ellos, sus representaciones subyacentes son diferentes (4 bytes contra 8 bytes). Decimals son aún más diferente.

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

Otros consejos

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 decimales, porque están destinados a ser una aproximación (básicamente, para los 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 enteros no convertir automáticamente, ya que pueden almacenar cada uno de los valores que son imposibles para los demás (uints tener el doble de la gama de enteros positivos).

Una vez que el cuelgue de todo esto, lo que realmente hace un montón de sentido.

En cuanto a su cosa edades, me basta con utilizar un int;)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top