Pergunta

A maior parte do tempo nós representam conceitos que nunca pode ser menor que 0.Por exemplo, para declarar comprimento, podemos escrever:

int length;

O nome exprime a sua finalidade, mas você pode atribuir valores negativos para ele.Parece que, para algumas situações, você pode representar a sua intenção mais claramente por escrito desta forma em vez disso:

uint length; 

Algumas desvantagens que eu posso pensar de:

  • não assinado tipos (uint, ulong, ushort) não são compatíveis com CLS, então você não pode usá-lo com outras linguagens que não suportam este
  • .Net classes de uso assinado tipos maior parte do tempo assim que você tem para lançar

Pensamentos?

Foi útil?

Solução

"Quando em Roma, faça como os Romanos fazem."

Enquanto não existe, teoricamente, uma vantagem na utilização de valores não assinados, onde aplicável, uma vez que torna o código mais expressivo, isso simplesmente não é feito em C#.Eu não tenho certeza de por que os desenvolvedores inicialmente não design de interfaces para manipular uints e fazer o tipo compatíveis com CLS, mas agora o trem deixou a estação.

Desde a consistência é importante, de maneira geral eu aconselho a tomar a C# estrada e usando ints.

Outras dicas

Se você diminuir um número com sinal, com um valor de 0, torna-se negativo e você pode facilmente testar isso.Se você diminuir um número não assinado com um valor de 0, fluxos de fundo e torna-se o valor máximo para o tipo - um pouco mais difícil de verificar.

O segundo ponto é o mais importante.Geralmente, você deve apenas usar int desde que uma boa "pega-tudo" para valores inteiros.Eu só iria usar uint se você absolutamente precisa ter a capacidade para contar superior int, mas sem usar a memória extra long requer (que não é muito, mais memória, portanto, não ser barato :-p).

Eu acho que o uso sutil da uint vs.int vai causar confusão com os desenvolvedores, a menos que ele foi escrito em diretrizes de desenvolvimento para a empresa.

Se o comprimento, por exemplo, não pode ser menor que zero, então ele deve ser expresso claramente na lógica de negócios de forma futuro, os desenvolvedores podem ler o código e saber a verdadeira intenção.

Just my 2 cents.

Eu gostaria de salientar que, em C# você pode ativar /checked para verificar aritmética overflow / underflow, o que não é uma má idéia, de qualquer maneira.Se o desempenho é importante em uma seção crítica, você ainda pode usar unchecked para evitar isso.

Para o código interno (ou seja, código que não será mencionada em qualquer de interoperabilidade solar com outras línguas) eu voto para utilizar unsigned quando a situação o justifique, tais como length variáveis como mencionado anteriormente.Este, juntamente com verificada aritmética fornece mais líquido para os desenvolvedores, a captura de bugs sutis anterior.

Outro ponto assinado vs não assinados debate é a de que alguns programadores usam valores como -1 para indicar erros, quando eles não teriam significado.Eu acompanho a visão de que cada variável deve ter apenas um propósito, mas se você - ou colegas de código - como para indicar erros desta forma, deixando variáveis assinado dá a você a flexibilidade para adicionar erro estados mais tarde.

Os dois pontos são bons.A principal razão para evitá-lo é de carcaça, embora.Carcaça torna extremamente irritante para usar.Eu tentei usar unisigned variáveis de uma vez, mas eu tinha para polvilhar lança absolutamente em toda parte, porque os métodos de estrutura de utilizar todos inteiros assinados.Portanto, sempre que você chamar um framework método, você precisa converter.

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