.NET Primitivos e hierarquias de tipo, por que foi projetado assim?
Pergunta
Eu gostaria de entender por que no .net existem nove tipos inteiros: Char
, Byte
, SByte
, Int16
, UInt16
, Int32
, UInt32
, Int64
, e UInt64
; Além de outros tipos numéricos: Single
, Double
, Decimal
; E todos esses tipos não têm relação.
Quando comecei a codificar em C#, pensei "legal, há um uint
Digite, vou usar isso quando valores negativos não são permitidos ". Então eu percebi que nenhuma API usada uint
mas int
Em vez disso, e isso uint
não é derivado de int
, então foi necessária uma conversão.
Quais são a aplicação do mundo real desses tipos? Por que não ter, em vez disso, integer
e positiveInteger
? Esses são tipos que eu posso entender. A idade de uma pessoa em anos é um positiveInteger
, e desde positiveInteger
é um subconjunto de integer
há necessidade de conversão sempre que integer
é esperado.
A seguir, é apresentado um diagrama da hierarquia do tipo em XPath 2.0 e XQuery 1.0. Se você olhar para baixo xs:anyAtomicType
você pode ver a hierarquia numérica decimal
> integer
> long
> int
> short
> byte
. Por que não foi projetado como .Net assim? A nova estrutura "Oslo" será diferente?
Solução
Meu palpite seria porque o hardware subjacente quebra essa hierarquia de classe. Existem (talvez surpreendentemente) muitas vezes quando você se importa que um UInt32
é um 4 bytes grandes e não assinados, então um UInt32
não é um tipo de Int32
, Nem é um Int32
um tipo de Int64
.
E você quase sempre se importa com a diferença entre um int
e a float
.
Fundamentalmente, a herança e a hierarquia de classes não são as mesmas que a inclusão matemática do conjunto. O fato de os valores um UInt32
pode segurar são um subconjunto estrito dos valores e Int64
pode segurar não significa que um UInt32
é um tipo de Int64
. Menos obviamente, um Int32
não é um tipo de Int64
- Embora não haja diferença conceitual entre eles, suas representações subjacentes são diferentes (4 bytes versus 8 bytes). Decimals
são ainda mais diferentes.
O XPath é diferente: as representações para todos os tipos numéricas são fundamentalmente iguais - uma sequência de dígitos ASCII. Lá, a diferença entre um short
e a long
é um dos possível alcance em vez de representação - "123" é uma representação válida de um short
e uma representação válida de um long
com o mesmo valor.
Outras dicas
Decimal destina -se a cálculos que precisam de precisão (basicamente, dinheiro). Veja aqui: http://msdn.microsoft.com/en-us/library/364x0z75(vs.80).aspx
Solteiros/duplos são diferentes dos decimais, porque pretendem ser uma aproximação (basicamente, para cálculos científicos).
É por isso que eles não estão relacionados.
Quanto a bytes e chars, eles são totalmente diferentes: um byte é 0-255, enquanto um char é um personagem e, portanto, pode armazenar caracteres Unicode (há muito mais de 255 deles!)
UINTs e INTs não se convertem automaticamente, porque cada um pode armazenar valores que são impossíveis para os outros (os UINTs têm o dobro da faixa positiva de INTs).
Depois de pegar o jeito de tudo, ele realmente faz muito sentido.
Quanto às suas idades, eu simplesmente usaria um int;)