Perché compili l’errore “Uso della variabile locale non assegnata”?

Il mio codice è il seguente

int tmpCnt; if (name == "Dude") tmpCnt++; 

Perché c’è un errore Use of unassigned local variable tmpCnt ? So che non l’ho inizializzato esplicitamente, ma a causa della tabella dei valori di default un tipo di valore è inizializzato con 0 comunque. Anche il riferimento mi ricorda:

Ricorda che l’uso di variabili non inizializzate in C # non è permesso.

Ma perché devo farlo esplicitamente se è già stato eseguito di default? Non otterrebbe prestazioni se non dovessi farlo? Mi stavo solo chiedendo …

Le variabili locali non sono inizializzate. Devi inizializzarli manualmente.

I membri sono inizializzati, ad esempio:

 public class X { private int _tmpCnt; // This WILL initialize to zero ... } 

Ma le variabili locali non sono:

 public static void SomeMethod() { int tmpCnt; // This is not initialized and must be assigned before used. ... } 

Quindi il tuo codice deve essere:

 int tmpCnt = 0; if (name == "Dude") tmpCnt++; 

Quindi il lungo e il corto è, i membri sono inizializzati, i locali non lo sono. Questo è il motivo per cui ottieni l’errore del compilatore.

Le assegnazioni predefinite si applicano ai membri della class, ma non alle variabili locali. Come Eric Lippert ha spiegato in questa risposta , Microsoft avrebbe potuto inizializzare i locali per impostazione predefinita, ma hanno scelto di non farlo perché l’utilizzo di un locale non assegnato è quasi sicuramente un bug.

Le seguenti categorie di variabili sono classificate come inizialmente non assegnate :

  • Variabili di istanza di variabili struct inizialmente non assegnate.
  • Parametri di output, inclusa questa variabile di struct instance constructors.
  • Variabili locali, ad eccezione di quelle dichiarate in una clausola catch o in una dichiarazione foreach.

Le seguenti categorie di variabili sono classificate come inizialmente assegnate :

  • Variabili statiche
  • Variabili di istanza delle istanze di class.
  • Variabili di istanza delle variabili struct inizialmente assegnate.
  • Elementi di matrice.
  • Parametri di valore
  • Parametri di riferimento
  • Variabili dichiarate in una clausola catch o in una dichiarazione foreach.

Sebbene i tipi di valore abbiano valori predefiniti e non possano essere nulli, devono anche essere inizializzati esplicitamente per poter essere utilizzati. Puoi pensare a queste due regole come regole affiancate. I tipi di valore NON possono essere nulli ==> il compilatore lo garantisce. Se chiedi come? il messaggio di errore che hai ricevuto è la risposta. Dopo aver chiamato i loro costruttori, sono stati resi inializzati con i loro valori predefiniti.

 int tmpCnt; // not accepted int tmpCnt = new Int(); // defualt value applied tmpCnt = 0 

Le variabili locali non vengono inizializzate automaticamente. Ciò accade solo con variabili a livello di istanza.

È necessario inizializzare esplicitamente le variabili locali se si desidera inizializzarle. In questo caso, (come spiega la documentazione collegata) impostando il valore 0 o utilizzando il new operatore.

Il codice che hai mostrato tenta effettivamente di usare il valore della variabile tmpCnt prima che sia inizializzato su qualsiasi cosa, e il compilatore giustamente ne avverte.

La tabella dei valori di default si applica solo all’inizializzazione di una variabile.

Per la pagina collegata, i seguenti due metodi di inizializzazione sono equivalenti …

 int x = 0; int x = new int(); 

Nel tuo codice, hai semplicemente definito la variabile, ma non hai mai inizializzato l’object.

Vedi questa discussione relativa ai bool non inizializzati, ma dovrebbe rispondere alla tua domanda.

Le variabili locali non sono inizializzate a meno che non si chiamino i loro costruttori (nuovi) o si assegni loro un valore.

le variabili locali non hanno un valore predefinito.

Devono essere assegnati definitivamente prima di usarli. Riduce la possibilità di utilizzare una variabile che ritieni di aver dato un valore ragionevole, quando in realtà ha un valore predefinito.