it-swarm.it

Dovrei usare int o Int32

In C #, int e Int32 sono la stessa cosa, ma ho letto un numero di volte in cui int è preferito su Int32 senza motivo. C'è una ragione, e dovrei preoccuparmi?

339
Graham

ECMA-334 : 2006 C # Language Specification (p18):

Ciascuno dei tipi predefiniti è una scorciatoia per un tipo fornito dal sistema. Ad esempio, la parola chiave int si riferisce alla struct System.Int32. Come stile, l'uso della parola chiave è favorito rispetto all'uso del nome completo del tipo di sistema.

125
SpaceghostAli

I due sono davvero sinonimi; int sarà un po 'più familiare, Int32 rende il 32-bitness più esplicito a chi legge il tuo codice. Sarei propenso a usare int dove ho solo bisogno di 'un numero intero', Int32 dove la dimensione è importante (codice crittografico, strutture) così i futuri manutentori sapranno che è sicuro ingrandire int se appropriato, ma dovresti fare attenzione a cambiare Int32s nel stessa strada.

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

265
James Sutherland

Entrambi dichiarano interi a 32 bit e, come dichiarato da altri poster, quello che si usa è principalmente una questione di stile sintattico. Tuttavia non si comportano sempre allo stesso modo. Ad esempio, il compilatore C # non consentirà questo:

public enum MyEnum : Int32
{
    member1 = 0
}

ma permetterà questo:

public enum MyEnum : int
{
    member1 = 0
}

Vai a capire.

84
raven

Uso sempre i tipi di sistema, ad esempio Int32 anziché int. Ho adottato questa pratica dopo aver letto Applied .NET Framework Programming - l'autore Jeffrey Richter fa un buon caso per usando i nomi completi dei tipi. Ecco i due punti che mi hanno colpito:

  1. I nomi dei tipi possono variare tra le lingue .NET. Ad esempio, in C #, long si associa a System.Int64 mentre in C++ con estensioni gestite, long esegue il mapping a Int32. Poiché le lingue possono essere combinate e abbinate durante l'utilizzo di .NET, puoi essere certo che l'uso del nome di classe esplicito sarà sempre più chiaro, indipendentemente dalla lingua preferita dal lettore.

  2. Molti metodi framework hanno nomi di tipi come parte dei loro nomi di 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

48

int è una parola chiave C # ed è non ambigua.

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

  • Devi avere un "sistema usando"; dichiarazione. l'utilizzo di "int" non richiede alcuna istruzione.
  • È possibile definire la propria classe chiamata Int32 (che sarebbe stupida e confusa). int significa sempre int.
20
Brownie

Come già detto, int = Int32. Per sicurezza, assicurati di utilizzare sempre int.MinValue/int.MaxValue quando implementi tutto ciò che riguarda i limiti del tipo di dati. Supponiamo che .NET decida che int ora sarebbe Int64, il tuo codice sarebbe meno dipendente dai limiti.

13
spoulson

La dimensione del byte per i tipi non è troppo interessante quando si ha a che fare con una sola lingua (e per il codice che non è necessario ricordare a se stessi di overflow di matematica). La parte che diventa interessante è quando fai il bridge tra una lingua e l'altra, C # per COM oggetto, ecc. Oppure stai facendo un po 'di shift o di mascheramento e devi ricordare a te stesso (e ai tuoi co-wokers di revisione del codice) della dimensione dei dati.

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

Finché probabilmente lo sai, in C # è 64-bit, ma in C++ nativo, finisce come 32-bit, o char è unicode/16-bit mentre in C++ è 8-bit. Ma come lo sappiamo? La risposta è, perché abbiamo cercato nel manuale e lo ha detto.

Con il tempo e le esperienze inizierai ad essere più coscienzioso quando scrivi codici per collegare tra C # e altri linguaggi (alcuni lettori qui pensano "perché lo faresti?"), Ma IMHO credo che sia una pratica migliore perché Non riesco a ricordare quello che ho codificato la scorsa settimana (o non devo specificare nel mio documento API che "questo parametro è intero a 32 bit").

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

Immagino che dipenderà solo da quali applicazioni stai codificando, da chi lo sta usando, da quali pratiche di codifica tu e il tuo team seguite, ecc. Per giustificare quando usare Int32.

9
HidekiAI

Non vi è alcuna differenza tra int e Int32, ma poiché int è una parola chiave della lingua molte persone lo preferiscono stilisticamente (proprio come con string vs String).

8
Simon Steele

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

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

Sono particolarmente affezionato a quest'ultimo. :)

7
Greg D

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

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

Sembra brutto vedere qualcosa come int.TryParse (). Non c'è altra ragione per cui io faccia questo diverso dallo stile.

6
Mark A. Nicolosi

Anche se sono (per lo più) identici (vedi sotto per la differenza [bug]), dovresti assolutamente averne cura e dovresti usare Int32.

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

  • La domanda della dimensione di una variabile di tipo Int16, Int32 o Int64 è autoreferenziale, ma la questione della dimensione di una variabile di tipo int è una domanda perfettamente valida e domande, non importa quanto siano banali, sono fonte di distrazione, piombo confusione, perdere tempo, ostacolare la discussione, ecc. (il fatto che questa domanda esista dimostra il punto).

  • L'utilizzo di Int32 promuove che lo sviluppatore è consapevole della propria scelta di tipo. Quanto è grande un int di nuovo? Oh sì, 32. La probabilità che la dimensione del tipo venga effettivamente considerata è maggiore quando la dimensione è inclusa nel nome. L'utilizzo 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 diventare "il tipo intero".

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

  • int non è una parola chiave in tutti i linguaggi .NET.

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

Gli svantaggi sono due caratteri in più da digitare e [bug].

Questo non verrà compilato

public enum MyEnum : Int32
{
    AEnum = 0
}

Ma questo:

public enum MyEnum : int
{
    AEnum = 0
}
5
unknown (yahoo)

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

5
Raithlin

Non dovresti preoccuparti. Dovresti usare int il più delle volte. Aiuterà il porting del tuo programma su un'architettura più ampia in futuro (attualmente int è un alias per System.Int32 ma potrebbe cambiare). Solo quando la larghezza del bit della variabile è importante (ad esempio: per controllare il layout in memoria di un struct) dovresti usare int32 e altri (con l'associato "using System;").

4
yhdezalvarez

Consiglierei l'uso di 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 vuole un po 'per abituarsi, ma rende sicuramente più bello il tuo codice.

Puoi includerlo nel tuo processo di compilazione per verificare automaticamente le violazioni.

3
devstuff

int è lo stesso di System.Int32 e quando compilato diventerà la stessa cosa in CIL .

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

A proposito, finisco per usare System.Int32 quando dichiaro le importazioni di varie funzioni dell'API di Windows. Non sono sicuro che questa sia una convenzione definita o no, ma mi ricorda che sto andando a una DLL esterna ...

3
Jack Bolding

C'era una volta, il tipo di dati int è stato ancorato alla dimensione del registro della macchina presa di mira dal compilatore. Ad esempio, un compilatore per un sistema a 16 bit utilizza un numero intero a 16 bit.

Tuttavia, fortunatamente non vediamo più molti 16-bit, e quando 64-bit ha iniziato a far sì che le persone popolari fossero più preoccupate di renderlo compatibile con i vecchi software e 32-bit erano in circolazione da così tanto tempo che per la maggior parte dei compilatori int è assunto come 32 bit.

3
Joel Coehoorn

int è il collegamento in lingua C # per System.Int32

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

"Sul problema a 64 bit - Microsoft sta effettivamente lavorando su una versione a 64 bit di .NET Framework ma sono abbastanza sicuro che NON verrà mappato a 64 bit su quel sistema.

Motivi:

1. Lo standard C # ECMA dice specificatamente che int è a 32 bit e lungo è a 64 bit.

2. Microsoft ha introdotto proprietà e metodi aggiuntivi 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 di C # incorporati manterranno la loro attuale mappatura. "

3
Ray Hayes

Non dovresti preoccuparti. Se la dimensione è una preoccupazione, utilizzerei byte, short, int, quindi long. L'unica ragione per cui utilizzerai un int maggiore di int32 è se hai bisogno di un numero superiore a 2147483647 o inferiore a -2147483648.

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

2
David Basarab

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

2
Jesper Kihlberg

Non fa alcuna differenza nella pratica e nel tempo si adotterà la propria convenzione. Tendo ad usare la parola chiave quando si assegna un tipo e la versione della classe quando si usano metodi statici e così:

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

2
chrisb

int è un alias per System.Int32, come definito in questa tabella: Tabella dei tipi built-in (riferimento C #)

1
Jim T

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

Usa la variante Nullable Int? o Int32? quando lavori con database su campi che contengono null. Ciò ti salverà da molti problemi di runtime.

0
bovium

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

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

L'altro giorno ho trovato una differenza! Il compilatore non ti permette 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

0
Schmuli

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

Alcuni standard di codifica (MISRA C) richiedono che tutti i tipi utilizzati siano di dimensioni specificate (ad esempio Int32 e non int).

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

Dovresti preoccuparti perché rende il tuo codice più portabile e più manutenibile.

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

Ihmo manutenibile sarà sempre applicabile, in quanto la persona che gestisce il tuo codice potrebbe non essere a conoscenza di questa particolare specifica C # e perdere un bug se l'int occasional diventa più di 2147483647.

In un semplice ciclo continuo che conta ad esempio i mesi dell'anno, non ti interessa, ma quando usi la variabile in un contesto in cui potrebbe eventualmente fluire, dovresti preoccuparti.

Dovresti anche preoccuparti di eseguire operazioni bit-bit su di esso.

0
user11211

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

0
Stacker

L'utilizzo del tipo Int32 richiede un riferimento allo spazio dei nomi a System o alle qualifiche complete (System.Int32). Tendo verso int, perché non richiede l'importazione di un namespace, riducendo quindi la possibilità di collisione nello spazio dei nomi in alcuni casi. Quando compilato per IL, non vi è alcuna differenza tra i due.

0
Michael Meadows

Non importa. int è la parola chiave della lingua e Int32 il suo tipo di sistema effettivo.

Vedi anche la mia risposta qui a una domanda correlata.

0
Keith

In base alla finestra immediata in 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
Selim

Considera anche Int16. Se è necessario memorizzare un numero intero nella memoria dell'applicazione e si è preoccupati della quantità di memoria utilizzata, è possibile utilizzare Int16 poiché utilizza meno memoria e ha un intervallo min/max più piccolo di Int32 (che è ciò che int è .)

0