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?

alt text

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top