En règle générale, vous devez toujours utiliser le type de données le plus spécifique possible pour vos données.
Si, par exemple, vous utilisez Entity Framework pour extraire des données d'une base de données, EF utilisera automatiquement le type de données le plus proche de celui utilisé dans la base de données.
Il y a deux problèmes avec cela en C #.
Tout d'abord, la plupart des développeurs C # utilisent uniquement int
, pour représenter des nombres entiers (sauf s'il y a une raison d'utiliser long
). Cela signifie que les autres développeurs ne penseront pas à vérifier le type de données, ils obtiendront donc les erreurs de débordement mentionnées ci-dessus. La deuxième et question plus critique, est / était que de .NET opérateurs arithmétiques d' origine uniquement pris en charge int
, uint
, long
, ulong
, float
, double, et decimal
*. C'est toujours le cas aujourd'hui (voir la section 7.8.4 dans les spécifications du langage C # 5.0 ). Vous pouvez le tester vous-même à l'aide du code suivant:
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;
Le résultat de notre byte
- byte
est un int
( System.Int32
).
Ces deux problèmes ont donné lieu à la pratique de "n'utiliser que des nombres entiers" qui est si courante.
Donc, pour répondre à votre question, en C #, c'est généralement une bonne idée de s'en tenir à int
moins que:
- Un générateur de code automatisé a utilisé une valeur différente (comme Entity Framework).
- Tous les autres développeurs du projet savent que vous utilisez les types de données les moins courants (incluez un commentaire indiquant que vous avez utilisé le type de données et pourquoi).
- Les types de données les moins courants sont déjà couramment utilisés dans le projet.
- Le programme nécessite les avantages du type de données moins courant (vous en avez 100 millions que vous devez conserver en RAM, donc la différence entre un
byte
et un int
ou un int
et un long
est critique, ou les différences arithmétiques des éléments non signés déjà mentionnés).
Si vous devez faire des calculs sur les données, respectez les types courants.
N'oubliez pas que vous pouvez effectuer un cast d'un type à un autre. Cela peut être moins efficace du point de vue du processeur, vous êtes donc probablement mieux avec l'un des 7 types courants, mais c'est une option si nécessaire.
Enumerations ( enum
) est l'une de mes exceptions personnelles aux directives ci-dessus. Si je n'ai que quelques options, je spécifierai que l'énumération est un octet ou un court. Si j'ai besoin de ce dernier bit dans une énumération signalée, je spécifierai le type à utiliser uint
afin de pouvoir utiliser hex pour définir la valeur du drapeau.
Si vous utilisez une propriété avec un code de restriction de valeur, assurez-vous d'expliquer dans la balise récapitulative quelles sont les restrictions et pourquoi.
* Les alias C # sont utilisés à la place des noms .NET, System.Int32
car il s'agit d'une question C #.
Remarque: il y avait un blog ou un article des développeurs .NET (que je ne peux pas trouver), qui soulignait le nombre limité de fonctions arithmétiques et certaines raisons pour lesquelles ils ne s'en préoccupaient pas. Si je me souviens bien, ils ont indiqué qu'ils n'avaient pas l'intention d'ajouter la prise en charge des autres types de données.
Remarque: Java ne prend pas en charge les types de données non signés et ne prenait auparavant pas en charge les nombres entiers 8 ou 16 bits. Étant donné que de nombreux développeurs C # venaient d'un arrière-plan Java ou devaient travailler dans les deux langues, les limitations d'une langue étaient parfois imposées artificiellement à l'autre.