Geralmente, você deve sempre usar o tipo de dados mais específico possível para os seus dados.
Se, por exemplo, você estiver usando o Entity Framework para extrair dados de um banco de dados, o EF usará automaticamente o tipo de dados mais próximo do usado no banco de dados.
Há dois problemas com isso em c #.
Primeiro, a maioria dos desenvolvedores de C # usa apenas int
para representar números inteiros (a menos que haja um motivo para usá-lo long
). Isso significa que outros desenvolvedores não pensarão em verificar o tipo de dados e, portanto, receberão os erros de estouro mencionados acima. A segunda, e assunto mais crítico, é / era que do .NET operadores aritméticos originais suportado apenas int
, uint
, long
, ulong
, float
, duplos, e decimal
*. Esse ainda é o caso hoje (consulte a seção 7.8.4 na especificação de idioma do C # 5.0 ). Você pode testar isso usando o seguinte código:
byte a, b;
a = 1;
b = 2;
var c = a - b; //In visual studio, hover over "var" and the tip will indicate the data type, or you can get the value from cName below.
string cName = c.GetType().Namespace + '.' + c.GetType().Name;
O resultado do nosso byte
- byte
é um int
( System.Int32
).
Esses dois problemas deram origem à prática do "único uso int para números inteiros", que é tão comum.
Portanto, para responder sua pergunta, em C # geralmente é uma boa ideia manter-se, a int
menos que:
- Um gerador de código automatizado usava um valor diferente (como o Entity Framework).
- Todos os outros desenvolvedores do projeto sabem que você está usando os tipos de dados menos comuns (inclua um comentário indicando que você usou o tipo de dados e por quê).
- Os tipos de dados menos comuns já são usados no projeto.
- O programa requer os benefícios do tipo de dados menos comum (você tem 100 milhões deles que precisa manter na RAM, portanto a diferença entre a
byte
e um int
ou um int
e a e a long
é crítica, ou as diferenças aritméticas dos não assinados já mencionados).
Se você precisar fazer cálculos nos dados, siga os tipos comuns.
Lembre-se, você pode transmitir de um tipo para outro. Isso pode ser menos eficiente do ponto de vista da CPU, então você provavelmente está melhor com um dos sete tipos comuns, mas é uma opção, se necessário.
Enumerações ( enum
) é uma das minhas exceções pessoais às diretrizes acima. Se eu tiver apenas algumas opções, especificarei a enumeração como um byte ou um curto. Se eu precisar desse último bit em uma enum sinalizada, especificarei o tipo a ser uint
usado para que eu possa usar hex para definir o valor da sinalização.
Se você usar uma propriedade com código de restrição de valor, não deixe de explicar na tag de resumo quais restrições existem e por quê.
* Aliases de C # são usados em vez de nomes de .NET, como se System.Int32
trata de uma pergunta de C #.
Nota: havia um blog ou artigo dos desenvolvedores .NET (que não consigo encontrar), que apontava o número limitado de funções aritméticas e algumas razões pelas quais eles não se preocupavam. Pelo que me lembro, eles indicaram que não tinham planos de adicionar suporte para os outros tipos de dados.
Nota: Java não suporta tipos de dados não assinados e anteriormente não tinha suporte para números inteiros de 8 ou 16 bits. Como muitos desenvolvedores de C # vieram de Java ou precisavam trabalhar em ambas as linguagens, as limitações de uma linguagem às vezes seriam artificialmente impostas à outra.