Dovrei usare int o Int32


352

In C #, inte Int32sono la stessa cosa, ma ho letto un numero di volte che intè preferito rispetto Int32a nessun motivo dato. C'è una ragione, e dovrei preoccuparmene?


Tweet dallo Skeet su questo dove preferisce Int32 su int durante la programmazione di API.
Comicme del

@JohnBubriski: e non dimentichiamoci che richiede meno istruzioni d'uso per usarlo (o dovresti scrivere System.Int32)
vedi

ho una domanda: non stiamo usando direttamente il tipo CLR ma perché ne abbiamo bisogno ??
AminM,

@JohnBubriski L'aggiornamento dello stato di Facebook è più facile da digitare rispetto a un codice. Cattivo pensiero lì! Più facile da leggere e comprendere è molto più importante che più facile da scrivere. When something can be read without effort, great effort has gone into its writing. Easy writing is hard reading
7hi4g0,

Risposte:


134

ECMA-334 : 2006 Specifica del linguaggio C # (p18):

Ciascuno dei tipi predefiniti è una scorciatoia per un tipo fornito dal sistema. Ad esempio, la parola chiave si intriferisce alla struttura System.Int32. Per motivi di stile, l'uso della parola chiave è preferito rispetto all'uso del nome completo del tipo di sistema.


271

I due sono davvero sinonimi; intsarà un po 'più familiare, Int32renderà il 32-testimone più esplicito per coloro che leggono il tuo codice. Sarei propenso a usare intdove ho solo bisogno di 'un numero intero', Int32dove la dimensione è importante (codice crittografico, strutture) in modo che i futuri manutentori sapranno che è sicuro ingrandire un intse appropriato, ma dovrei fare attenzione a cambiare Int32s allo stesso modo.

Il codice risultante sarà identico: la differenza è puramente di leggibilità o aspetto del codice.


65
Le persone che leggono il tuo codice dovrebbero sapere che int è un alias per System.Int32. Per quanto riguarda la leggibilità, la coerenza è molto più importante.
Troels Thomsen,

11
Per quelli di voi con la vecchia mentalità C ++, IntPtr è progettato per essere a 32 bit su un sistema operativo a 32 bit e 64 bit su un sistema operativo a 64 bit. Questo comportamento è specificamente menzionato nel suo tag di riepilogo. msdn.microsoft.com/en-us/library/system.intptr(VS.71).aspx
diadem

87

Entrambi dichiarano numeri interi a 32 bit e, come affermato da altri poster, quale si utilizza è principalmente una questione di stile sintattico. Tuttavia non si comportano sempre allo stesso modo. Ad esempio, il compilatore C # non lo consentirà:

public enum MyEnum : Int32
{
    member1 = 0
}

ma consentirà questo:

public enum MyEnum : int
{
    member1 = 0
}

Vai a capire.


9
Se usi Reflector per esaminare il tipo System.Int32, scoprirai che si tratta di una struttura e non di una classe. Il codice è simile al seguente: [Serializable, StructLayout (LayoutKind.Sequential), ComVisible (true)] public struct Int32: IComparable, IFormattable, IConvertible, IComparable <int>, IEquatable <int> {public const int MaxValue = 0x7fffffff; ... Non è possibile derivare un tipo da una struttura. Per lo meno riceverai un errore che te lo dice. Tuttavia, il comportamento enum è un po 'diverso, che commenterò in seguito.
Raddevus,

16
L'incapacità di derivare un enum da Int32 è un comportamento progettato, che può essere visto anche guardando il codice .NET: [Serializable, ComVisible (true)] classe astratta pubblica Enum: ValueType, IComparable, IFormattable, Notare che Enum è derivato da ValueType? Se si tenta di derivare un enum da qualcos'altro oltre a un tipo di dati intrinseco (int, byte, ecc.) Si riceverà un errore simile a: Tipo byte, sbyte, short, ushort, int, uint, long o ulong previsto .
Raddevus,

2
@daylight nota che specificare un enumda usare intnon è un derive, ma specificare un underlying type; vedi msdn.microsoft.com/en-us/library/sbbt4032.aspx#code-snippet-2
Jeroen Wiert Pluimers

2
@JeroenWiertPluimers Tuttavia, è ancora interessante il motivo per cui hanno scelto di controllare letteralmente il tipo sottostante e di lanciare CS1008 , poiché il tipo sottostante è solo il tipo di costanti nell'enum, quindi non importa quando compilato.
IllidanS4 vuole che Monica torni il

5
@ IllidanS4, con il nuovo compilatore Roslyn - questo è stato risolto, ed entrambe le varianti sono valide
Grundy

49

Uso sempre i tipi di sistema, ad esempio Int32invece di int. Ho adottato questa pratica dopo aver letto la programmazione di Applied .NET Framework - l'autore Jeffrey Richter è un buon caso per usare i nomi di tipo completo. Ecco i due punti che mi hanno attaccato:

  1. I nomi dei tipi possono variare tra le lingue .NET. Ad esempio, in C #, longmappa a System.Int64 mentre in C ++ con estensioni gestite, longmappa a Int32. Poiché le lingue possono essere combinate e abbinate durante l'utilizzo di .NET, si può essere certi che l'utilizzo del nome della classe esplicita sarà sempre più chiaro, indipendentemente dalla lingua preferita del lettore.

  2. Molti metodi framework hanno nomi di tipi come parte dei nomi dei metodi:

    BinaryReader br = new BinaryReader( /* ... */ );
    float val = br.ReadSingle();     // OK, but it looks a little odd...
    Single val = br.ReadSingle();    // OK, and is easier to read

Un problema con questo è che il completamento automatico di Visual Studio utilizza ancora int. Quindi, se fai un List<Tuple<Int32, Boolean>> test = new, Visual Studio ora inserirà List<Tuple<int, bool>>(). Conosci un modo per modificare questi completamenti automatici?
MrFox,

2
Sì, è un problema; no, non so come cambiarli a mano. Il punto n. 2 non è più un problema per me, poiché tendo a utilizzare varil più possibile per ridurre la prolissità del codice. In quei punti occasionali in cui il completamento automatico entra e si sputa sul mio pavimento, mi adeguo manualmente - è letteralmente un secondo o due del mio tempo.
Remi Despres-Smyth,

20

int è una parola chiave C # ed è inequivocabile.

Il più delle volte non importa, ma due cose che vanno contro Int32:

  • È necessario disporre di un "utilizzo del sistema;" dichiarazione. l'utilizzo di "int" non richiede alcuna istruzione using.
  • È possibile definire la propria classe chiamata Int32 (che sarebbe sciocca e confusa). int significa sempre int.

È anche possibile creare la tua classe 'var', ma ciò non scoraggia le persone dall'usarlo.
Neme,

Ogni parola chiave è una parola chiave C #. int era già utilizzato in C e C ++. Quindi non c'è nulla di specifico in C # al riguardo.
MrFox,

12

Come già detto, int= Int32. Per sicurezza, utilizzare sempre int.MinValue/ int.MaxValuequando si implementa qualcosa che si preoccupa dei limiti del tipo di dati. Supponiamo che .NET abbia deciso che intora sarebbe Int64, il tuo codice sarebbe meno dipendente dai limiti.


8
@spoulson: errore di commento sulla riga 1: assegnazione vietata tra tipi uguali. Sì, una brutta battuta.
Johann Gerell,

22
Se il C # spec (si tratta di un C #, non decisione NET) mai deciso di cambiare per fare int64 bit, che sarebbe come un cambiamento di rottura che non credo sia possibile (o certamente sensibile) al codice di difesa contro tali eventualità.
Jon Skeet,

9

La dimensione dei byte per i tipi non è troppo interessante quando si ha a che fare solo con una singola lingua (e per il codice che non è necessario ricordare a te stesso sugli overflow matematici). La parte che diventa interessante è quando fai un ponte tra una lingua e un'altra, da C # a oggetto COM, ecc., O stai facendo qualche spostamento di bit o mascheramento e devi ricordare a te stesso (e ai tuoi co-wokers di revisione del codice) delle dimensioni dei dati.

In pratica, di solito uso Int32 solo per ricordare a me stesso di che dimensione sono perché scrivo C ++ gestito (per passare ad esempio a C #) e C ++ non gestito / nativo.

Per quanto probabilmente sai, in C # è 64 bit, ma in C ++ nativo, finisce come 32 bit, oppure char è unicode / 16 bit mentre in C ++ è 8 bit. Ma come lo sappiamo? La risposta è, perché l'abbiamo cercata nel manuale e lo ha detto.

Con il tempo e le esperienze, inizierai a essere più coscienzioso quando scrivi codici per creare un ponte tra C # e altre lingue (alcuni lettori qui pensano "perché dovresti?"), Ma IMHO credo che sia una pratica migliore perché Non ricordo cosa ho codificato la scorsa settimana (o non devo specificare nel mio documento API che "questo parametro è un numero intero a 32 bit").

In F # (anche se non l'ho mai usato), definiscono int , int32 e nativeint . La stessa domanda dovrebbe sorgere, "quale devo usare?". Come altri hanno già detto, nella maggior parte dei casi non dovrebbe importare (dovrebbe essere trasparente). Ma io per uno sceglierei int32 e uint32 solo per rimuovere le ambiguità.

Immagino dipenderebbe solo da quali applicazioni stai codificando, da chi lo sta usando, da quali pratiche di codifica segui te e il tuo team, ecc. Per giustificare quando usare Int32.


Ciò non invalida lo scopo di .net? Che cos'è F #, comunque, un'idea di Gates che è andata via con la sua pensione ...
Nick Turner

8

Non c'è alcuna differenza tra inte Int32, ma poiché intè una parola chiave per linguaggio molte persone la preferiscono stilisticamente (proprio come con stringvs String).


7

Nella mia esperienza è stata una cosa convenzionale. Non sono a conoscenza di alcun motivo tecnico per utilizzare int su Int32, ma è:

  1. Più veloce da digitare.
  2. Più familiare allo sviluppatore C # tipico.
  3. Un colore diverso nell'evidenziazione della sintassi di Visual Studio predefinita.

Sono particolarmente affezionato a quest'ultimo. :)


7

Uso sempre i tipi con alias (int, string, ecc.) Quando definisco una variabile e utilizzo il nome reale quando accedo a un metodo statico:

int x, y;
...
String.Format ("{0}x{1}", x, y);

Sembra brutto vedere qualcosa di simile a int.TryParse (). Non c'è altro motivo per cui lo faccio oltre allo stile.


5

So che la migliore pratica è usare int, e tutto il codice MSDN usa int. Tuttavia, per quanto ne so, non c'è motivo al di là della standardizzazione e della coerenza.


5

Sebbene siano (per lo più) identici (vedi sotto per la differenza [bug]), sicuramente ti dovrebbe interessare e dovresti usare Int32.

  • Il nome per un numero intero a 16 bit è Int16. Per un numero intero a 64 bit è Int64 e per un numero intero a 32 bit la scelta intuitiva è: int o Int32?

  • La domanda sulla dimensione di una variabile di tipo Int16, Int32 o Int64 è autoreferenziale, ma la domanda sulla dimensione di una variabile di tipo int è una domanda perfettamente valida e domande, non importa quanto banali, siano fonte di distrazione, conducono confusione, perdita di tempo, ostacolo alla discussione, ecc. (il fatto che questa domanda esista dimostra il punto).

  • L'utilizzo di Int32 promuove che lo sviluppatore è consapevole della propria scelta del tipo. Quanto è grande di nuovo un int? Oh sì, 32. La probabilità che la dimensione del tipo venga effettivamente considerata è maggiore quando la dimensione è inclusa nel nome. L'uso di Int32 promuove anche la conoscenza delle altre scelte. Quando le persone non sono costrette a riconoscere almeno ci sono alternative, diventa troppo facile per int per diventare "IL tipo intero".

  • La classe all'interno del framework destinata a interagire con numeri interi a 32 bit è denominata Int32. Ancora una volta, che è: più intuitivo, meno confuso, manca di una traduzione (non necessaria) (non una traduzione nel sistema, ma nella mente dello sviluppatore), ecc. int lMax = Int32.MaxValueOppure Int32 lMax = Int32.MaxValue?

  • int non è una parola chiave in tutte le lingue .NET.

  • Sebbene ci siano argomenti per cui non è probabile che cambi mai, int potrebbe non essere sempre un Int32.

Gli svantaggi sono due caratteri extra da digitare e [bug].

Questo non verrà compilato

public enum MyEnum : Int32
{
    AEnum = 0
}

Ma questo:

public enum MyEnum : int
{
    AEnum = 0
}

Dici "Il nome per un numero intero a 16 bit è Int16, per un numero intero a 64 bit è Int64, e per un numero intero a 32 bit la scelta intuitiva è: int o Int32?", Ma ci sono anche parole chiave C # per questi. Int16 = short Int64 = long Quindi, punto una delle tue risposte si basa su un presupposto errato.
Mel,

"La variabile di tipo int è una domanda e domande perfettamente valide, per quanto banali, possano distrarre, portare a confusione, perdere tempo, ostacolare la discussione, ecc. (il fatto che questa domanda esista dimostra il punto)." Ma stai scherzando? Lavori in un linguaggio che non capisci perfettamente cosa c'è dietro il cofano. Se lo sviluppatore non capisce a cosa equivale il tipo primitivo, dovrebbe prendere le arti culinarie. Sembra uno sviluppatore VB. l'uso delle primitive è nativo di qualsiasi lingua e dovrebbe essere preferito. Va bene se non ti piacciono i primitivi, ma non inventare le realtà.
Nick Turner

Hmm, sono totalmente in disaccordo con la tua opinione sul fatto che mi dovrebbe interessare ... ma non sapevo che gli enum possano ereditare solo dalle parole chiave. Un fatto piuttosto inutile, ma comunque divertente da sapere :)
Jowen,

4

Non dovrebbe interessarti. Dovresti usare la intmaggior parte del tempo. Aiuterà il porting del tuo programma su un'architettura più ampia in futuro (attualmente intè un alias System.Int32ma potrebbe cambiare). Solo quando l'ampiezza dei bit della variabile è importante (ad esempio: per controllare il layout in memoria di a struct) dovresti usare int32e altri (con il " using System;" associato ).


1
Non puoi essere serio ... rendere più facile il porting? Non credo che trovare e sostituire sia un grosso problema.
Vince Panuccio,

2
(attualmente int è un alias di System.Int32 ma potrebbe cambiare) ? Oh, vieni uno ... Sei serio?
Oybek,

Perché dovresti scrivere il codice in una lingua che vuoi eventualmente eliminare? Sembra come da decisione della direzione. Usa int o Int32. Int32 sembra VB
Nick Turner

Quello che volevo dire era che FORSE, (e questo è un grande FORSE, non so davvero perché i designer lo abbiano fatto in quel modo) dovresti avere un modo per dichiarare un int che abbia la stessa larghezza dell'arco su cui stai correndo, come funziona int / long / ... di C. Questo è un meccanismo (da int alias int32) che sembra progettato per fare esattamente questo. E prendi in considerazione che Microsoft consiglia sempre di utilizzare "int" vs "Int32" (proprio come farebbero se questa fosse la loro intenzione originale). Lo so, questo è un grande IF ... Quando ho scritto questa risposta, non c'era alcun framework .NET a 64 bit, quindi non sapevo cosa avrebbero fatto in quel caso.
Yanko Hernández Alvarez

3

int è la scorciatoia del linguaggio C # per System.Int32

Mentre questo significa che Microsoft potrebbe cambiare questa mappatura, un post sulle discussioni di FogCreek ha dichiarato [fonte]

"Sul problema a 64 bit - Microsoft sta davvero lavorando su una versione a 64 bit di .NET Framework ma sono abbastanza sicuro che int non eseguirà il mapping a 64 bit su quel sistema.

Motivi:

1. Lo standard ECMA C # afferma specificamente che int è a 32 bit e long è a 64 bit.

2. Microsoft ha introdotto ulteriori proprietà e metodi in Framework versione 1.1 che restituiscono valori lunghi anziché valori int, come Array.GetLongLength oltre a Array.GetLength.

Quindi penso che sia sicuro dire che tutti i tipi C # integrati manterranno la loro mappatura attuale. "


Se viene introdotta una versione a 64 bit, probabilmente aggiungeranno "nativeint" a C # (poiché è attualmente utilizzato in F #). Questo non fa che rafforzare il fatto che introdurre "int" e definirlo come Int32 sia stato un errore! E così incoerente dal punto di vista API (cioè ReadInt32 non ReadInt), colore (scuro vs azzurro) e maiuscole / minuscole (DateTime vs int). cioè perché il tipo di valore 'DateTime' non ha un alias come Int32?
Carlo Bos,

3

int è uguale a System.Int32 e una volta compilato si trasformerà nella stessa cosa in CIL .

Usiamo int per convenzione in C # poiché C # vuole apparire come C e C ++ (e Java) ed è quello che usiamo lì ...

A proposito, finisco con System.Int32 quando dichiaro le importazioni di varie funzioni dell'API di Windows. Non sono sicuro se si tratta di una convenzione definita o meno, ma mi ricorda che sto andando a una DLL esterna ...


3

C'era una volta, il tipo di dati int era ancorato alla dimensione del registro della macchina targetizzata dal compilatore. Quindi, ad esempio, un compilatore per un sistema a 16 bit userebbe un numero intero a 16 bit.

Tuttavia, per fortuna non vediamo più molto a 16 bit, e quando 64 bit hanno iniziato a diventare popolari, le persone erano più preoccupate di renderlo compatibile con i software più vecchi e 32 bit erano in circolazione da così tanto tempo che per la maggior parte dei compilatori un int si presume che sia a 32 bit.


3

Consiglierei di usare Microsoft StyleCop .

È come FxCop , ma per problemi legati allo stile. La configurazione predefinita corrisponde alle guide di stile interne di Microsoft, ma può essere personalizzata per il tuo progetto.

Ci può volere un po 'per abituarsi, ma sicuramente rende il codice più bello.

Puoi includerlo nel processo di compilazione per verificare automaticamente la presenza di violazioni.


Non sono completamente d'accordo con StyleCop su questo. si va bene ma preferisco usare Int32, perché? come evitare risposte come le due declassate. Le persone confondono Int32 con come gli ints sono rappresentati in C
John Demetriou il

2

inted Int32è lo stesso. intè un alias per Int32.


int non è un alias, è una parola chiave. Vedi le altre risposte.
Timores,

int è sicuramente una parola chiave per la lingua, ma può anche essere definita un alias di System.Int32. Inoltre, un altro modo di pensare a questo è che hai una using int = System.Int32; direttiva per tutti i tuoi file di codice sorgente.
uygar donduran,

2

Non dovrebbe interessarti. Se la dimensione è un problema, userei byte, short, int, quindi long. L'unico motivo per cui dovresti usare un int più grande di int32 è se hai bisogno di un numero maggiore di 2147483647 o inferiore a -2147483648.

A parte questo non mi importerebbe, ci sono molti altri elementi di cui preoccuparsi.


Aggiungerei che puoi usare la parola chiave "long" invece di System.Int64
Keith,

22
Hai frainteso la domanda. L'OP chiede se esiste una differenza tra le dichiarazioni "int i" e "Int32 i".
corvo,

2

Non fa differenza nella pratica e col tempo adotterai la tua convenzione. Tendo a utilizzare la parola chiave quando si assegna un tipo e la versione della classe quando si utilizzano metodi statici e simili:

int total = Int32.Parse("1009");


1

Uso int nel caso in cui Microsoft cambi l'implementazione predefinita per un numero intero in una nuova versione confusa (chiamiamola Int32b).

Microsoft può quindi modificare l'alias int in Int32b e non devo modificare alcuno del mio codice per sfruttare la loro nuova (e si spera migliorata) implementazione di numeri interi.

Lo stesso vale per qualsiasi parola chiave del tipo.


0

Non dovresti preoccuparti della maggior parte dei linguaggi di programmazione, a meno che non sia necessario scrivere funzioni matematiche molto specifiche o un codice ottimizzato per un'architettura specifica ... Assicurati solo che la dimensione del tipo sia sufficiente per te (usa qualcosa di più grande di un Int se sai che avrai bisogno di più di 32 bit per esempio)


0

Non importa int è la parola chiave language e Int32 il suo tipo di sistema attuale.

Vedi anche la mia risposta qui a una domanda correlata.


0

L'uso di Int o Int32 è lo stesso Int è solo zucchero per semplificare il codice per il lettore.

Utilizzare la variante Nullable Int? o Int32? quando si lavora con database su campi contenenti null. Ciò ti salverà da molti problemi di runtime.


0

Alcuni compilatori hanno dimensioni diverse per int su piattaforme diverse (non specifiche per C #)

Alcuni standard di codifica (MISRA C) richiedono che tutti i tipi utilizzati siano specificati in base alle dimensioni (ovvero Int32 e non int).

È anche utile specificare i prefissi per diverse variabili di tipo (ad es. B per byte a 8 bit, w per parola a 16 bit e l per parola lunga a 32 bit => Int32 lMyVariable)

Dovresti preoccuparti perché rende il tuo codice più portatile e più gestibile.

Portable potrebbe non essere applicabile a C # se si utilizzerà sempre C # e le specifiche C # non cambieranno mai in questo senso.

Ihmo gestibile sarà sempre applicabile, perché la persona che mantiene il codice potrebbe non essere a conoscenza di questa specifica specifica C # e perdere un bug se l'int diventa occasionalmente più di 2147483647.

In un semplice for-loop che conta ad esempio i mesi dell'anno, non ti importerai, ma quando usi la variabile in un contesto in cui potrebbe eventualmente provenire, ti dovrebbe interessare.

Dovresti anche preoccuparti se hai intenzione di fare operazioni bit-saggio su di esso.


Non fa alcuna differenza in .Net - int è sempre Int32 e long è sempre Int64
Keith,

It is also good to specify prefixes for different type variablesLa notazione ungherese è ampiamente deprecata al giorno d'oggi e la maggior parte degli stili di codifica ne scoraggia l'uso. Le convenzioni interne delle società di software spesso vietano questa notazione
phuclv,

0

L'uso del Int32tipo richiede un riferimento allo spazio dei nomi Systemo pienamente qualificato ( System.Int32). Tendo a intfarlo, perché non richiede l'importazione di uno spazio dei nomi, riducendo quindi la possibilità di collisione dello spazio dei nomi in alcuni casi. Se compilato in IL, non c'è differenza tra i due.


0

Secondo la finestra immediata di Visual Studio 2012 Int32 è int, Int64 è lungo. Ecco l'output:

sizeof(int)
4
sizeof(Int32)
4
sizeof(Int64)
8
Int32
int
    base {System.ValueType}: System.ValueType
    MaxValue: 2147483647
    MinValue: -2147483648
Int64
long
    base {System.ValueType}: System.ValueType
    MaxValue: 9223372036854775807
    MinValue: -9223372036854775808
int
int
    base {System.ValueType}: System.ValueType
    MaxValue: 2147483647
    MinValue: -2147483648

0

Considera anche Int16. Se è necessario memorizzare un numero intero in memoria nella propria applicazione e si è preoccupati per la quantità di memoria utilizzata, è possibile utilizzare Int16 poiché utilizza meno memeory e ha un intervallo min / max minore di Int32 (che è ciò che int è .)


0

Qualche tempo fa stavo lavorando a un progetto con Microsoft quando abbiamo ricevuto una visita da qualcuno del team del prodotto CLR di Microsoft .NET. Questa persona ha codificato degli esempi e quando ha definito le sue variabili ha usato "Int32" vs. "int" e "String" vs. "string".

Mi ero ricordato di aver visto questo stile in un altro codice di esempio di Microsoft. Quindi, ho fatto qualche ricerca e ho scoperto che tutti dicono che non c'è differenza tra "Int32" e "int", tranne per la colorazione della sintassi. In effetti, ho trovato molto materiale che suggerisce di usare "Int32" per rendere il tuo codice più leggibile. Quindi, ho adottato lo stile.

L'altro giorno ho trovato la differenza! Il compilatore non ti consente di digitare enum usando "Int32", ma lo fa quando usi "int". Non chiedermi perché, perché non lo so ancora.

Esempio:

public  enum MyEnum : Int32
{
    AEnum = 0
}

Questo funziona

public enum MyEnum : int
{
    AEnum = 0
}

Tratto da: notazione Int32 vs. int

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.