In genere, dovresti sempre utilizzare il tipo di dati più specifico per i tuoi dati.
Se, ad esempio, si utilizza Entity Framework per estrarre 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 # utilizza solo int
, per rappresentare numeri interi (a meno che non vi sia un motivo per utilizzare long
). Ciò significa che altri sviluppatori non penseranno di verificare il tipo di dati, in modo da ottenere gli errori di overflow menzionati sopra.
Il secondo problema, più critico, è / era che .NET operatori aritmetici originali supportava solo int
, uint
, long
, ulong
, float
, double e decimal
*. Questo è ancora il caso oggi (vedere la sezione 7.8.4 in Specifiche linguistiche 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
).
Questi due problemi hanno dato origine alla pratica "usa solo int per numeri interi" che è così comune.
Quindi per rispondere alla tua domanda, in C # è generalmente una buona idea attenersi a int
a meno che:
- Un generatore di codice automatizzato ha utilizzato 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 indica che hai utilizzato il tipo di dati e perché).
- I tipi di dati meno comuni sono già usati comunemente nel progetto.
- Il programma richiede i vantaggi del tipo di dati meno comune (hai 100 milioni di questi devi tenere nella RAM, quindi la differenza tra
byte
e int
o int
e a long
è critico, o le differenze aritmetiche di unsigned già menzionate).
Se hai bisogno di fare matematica sui dati, segui i tipi più 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.
Enumerazioni ( enum
) è una delle mie eccezioni personali alle linee guida di cui sopra. Se ho solo poche opzioni, farò specificare l'enum come byte o breve . Se ho bisogno dell'ultimo bit in un enumerato, specificherò il tipo in uint
, quindi posso usare hex per impostare il valore per il flag.
Se utilizzi una proprietà con codice che limita i valori, assicurati di spiegare nel tag di riepilogo quali restrizioni esistono e perché.
* Alias di C # vengono utilizzati al posto di nomi .NET come System.Int32
poiché si tratta di una domanda in C #.
Nota: c'era un blog o un articolo degli sviluppatori .NET (che non trovo), che indicava il numero limitato di funzioni aritmetiche e alcuni motivi per cui non se ne preoccupavano. Come ricordo, hanno indicato che non avevano intenzione di aggiungere supporto per gli altri tipi di dati.
Nota: Java non supporta i tipi di dati non firmati e in precedenza non aveva supporto per numeri interi a 8 o 16 bit. Dal momento che molti sviluppatori di C # provenivano da uno sfondo Java o avevano bisogno di lavorare in entrambe le lingue, le limitazioni di una lingua venivano talvolta imposte artificialmente dall'altra.