Generalmente, dovresti sempre utilizzare il tipo di dati più specifico per i tuoi dati possibili.
Se, ad esempio, si utilizza Entity Framework per estrarre i dati da un database, EF utilizzerà automaticamente il tipo di dati più vicino a quello utilizzato nel database.
Ci sono due problemi con questo in C #.
Innanzitutto, la maggior parte degli sviluppatori C # usa solo int
, per rappresentare numeri interi (a meno che non ci sia un motivo per usare long
). Ciò significa che altri sviluppatori non penseranno di controllare il tipo di dati, quindi otterranno gli errori di overflow sopra menzionati. La seconda, e la questione più critica, è / era che di .NET operatori aritmetici originali supportate solo int
, uint
, long
, ulong
, float
, doppio, e decimal
*. Questo è ancora il caso oggi (vedere la sezione 7.8.4 nelle specifiche del linguaggio C # 5.0 ). Puoi testarlo tu stesso usando il seguente codice:
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;
Il risultato del nostro byte
- byte
è un int
( System.Int32
).
Queste due questioni hanno dato origine alla pratica "usare solo int per numeri interi" che è così comune.
Quindi, per rispondere alla tua domanda, in C # di solito è una buona idea attenersi a int
meno che:
- Un generatore di codice automatizzato utilizzava un valore diverso (come Entity Framework).
- Tutti gli altri sviluppatori del progetto sono consapevoli del fatto che stai utilizzando i tipi di dati meno comuni (includi un commento che sottolinea che hai utilizzato il tipo di dati e perché).
- I tipi di dati meno comuni sono già comunemente utilizzati nel progetto.
- Il programma richiede i vantaggi del tipo di dati meno comune (hai 100 milioni di questi che devi conservare nella RAM, quindi la differenza tra a
byte
e an int
o a int
e a long
è critica, o le differenze aritmetiche di unsigned già menzionate).
Se è necessario eseguire calcoli matematici sui dati, attenersi ai tipi comuni.
Ricorda, puoi trasmettere da un tipo all'altro. Questo può essere meno efficiente dal punto di vista della CPU, quindi probabilmente stai meglio con uno dei 7 tipi comuni, ma è un'opzione se necessario.
Enumerations ( enum
) è una delle mie eccezioni personali alle linee guida di cui sopra. Se ho solo alcune opzioni, specificherò l'enum come un byte o un corto. Se avessi bisogno di quell'ultimo bit in un enumerato contrassegnato, specificherò il tipo in uint
modo da poter usare hex per impostare il valore per il flag.
Se usi una proprietà con un codice che limita il valore, assicurati di spiegare nel tag di riepilogo quali sono le restrizioni e perché.
* Gli alias C # vengono utilizzati al posto dei nomi .NET come System.Int32
poiché si tratta di una domanda C #.
Nota: c'era un blog o un articolo degli sviluppatori .NET (che non riesco a trovare), che sottolineava il numero limitato di funzioni aritmetiche e alcuni motivi per cui non si preoccupavano. Come ricordo, hanno indicato che non avevano in programma di aggiungere supporto per gli altri tipi di dati.
Nota: Java non supporta tipi di dati senza segno e in precedenza non supportava numeri interi a 8 o 16 bit. Poiché molti sviluppatori C # provenivano da un background Java o dovevano lavorare in entrambe le lingue, i limiti di una lingua venivano talvolta imposti artificialmente sull'altra.