2012-03-15 21 views
7

Di seguito viene visualizzato un errore di compilazione con scritto "Uso della variabile locale non assegnata 'corrispondenza'" se si immette semplicemente la corrispondenza stringa; ma funziona quando uso string match = null; Quindi qual è la differenza e in generale, se a una stringa non viene assegnato immediatamente un valore, dovrei assegnare a null in questo modo?Cosa fa assegnare una variabile a null?

string question = "Why do I need to assign to null"; 
char[] delim = { ' ' }; 
string[] strArr = question.Split(delim); 
//Throws Error 
string match; 
//No Error 
//string match = null; 
foreach (string s in strArr) 
{ 
    if (s == "Why") 
     { 
     match = "Why"; 
     } 
} 
Console.WriteLine(match); 
+0

Il compilatore vuole solo sapere che intendevi :-) – Jodrell

+0

Esistono ancora diverse risposte su StackOverflow: solo una -> http://stackoverflow.com/questions/256073/c-sharp-error-use-of-unassigned -local-variable – AngeloBad

risposta

12

Il linguaggio C# impedisce l'utilizzo di un locale finché non è stato assegnato definitivamente un valore. In questo esempio il compilatore non capisce la semantica di Split e deve supporre che strArr possa essere una raccolta vuota e quindi il corpo del ciclo potrebbe potenzialmente non essere eseguito. Ciò significa che in una prospettiva di assegnazione definitiva lo foreach non assegna un valore a match. Quindi è ancora non assegnato quando si arriva a WriteLine

Cambiando la dichiarazione in string match = null il valore è contrassegnato come definitivamente assegnato sin dall'inizio. Il calcolo del ciclo non importa quindi

4

Stai riscontrando la differenza tra dichiarazione e assegnazione. Dichiarazione, con linee come

string match; 

semplicemente dichiara al compilatore che si prevede di utilizzare una variabile di tipo stringa match. Assegnazione, con linee come

match = null; 

assegna il valorenull a match.

È possibile che una lingua dichiari che la dichiarazione e il compito devono sempre essere separati (non sono sicuro al 100%, ma credo che le vecchie versioni di Visual Basic l'abbiano fatto), ma la maggior parte delle lingue consente di combinare la dichiarazione e l'assegnazione, la scrittura

string match = null; // combined declaration and assignment 

a significare

string match; // declaration 
match = null; // assignment 

C# richiede che le variabili essere assegnate prima di essere utilizzate. A differenza dei campi e degli eventi, le variabili locali non vengono automaticamente assegnate ai valori predefiniti, quindi è necessario dimostrare al compilatore che, prima di utilizzare match, match avrà un certo valore. Il compilatore non si cura del valore match, purché tale variabile sia di tipo stringa.

Nel tuo caso, il compilatore non può provare con l'analisi locale che strArr sarà non vuota perché il compilatore non ispezionare il codice di Split, quindi non c'è alcuna garanzia che il codice sarà anche entrare nel ciclo foreach, lascia lungo soddisfano le condizioni da assegnare a match. Poiché la chiamata Console.WriteLine utilizza match e dal match non può essere assegnata in fase di esecuzione con la dichiarazione string match, il compilatore richiede di assegnare match all'esterno del ciclo. Un modo per soddisfare il requisito è utilizzare string match = null anziché string match.

0

Quando si specifica, type variable = null;, si sta inizializzando la variabile. Se si specifica type variable;, si sta solo dichiarando la variabile.

+0

dovrebbe essere 'variable = null' - double == è il comparatore uguale a – Haedrian

+0

risolto! era troppo ansioso ..... –

2

Il compilatore ha compreso che è possibile utilizzare match senza che venga mai assegnato a nulla. Il ciclo foreach potrebbe non essere mai eseguito. Quindi hai dichiarato la variabile, ma il compilatore ha realizzato che è possibile accedervi senza mai essere assegnato, quindi l'errore.

5

dipende dal vostro scenario, però:

string match = null; 

Oppure:

string match = string.Empty; 

sono entrambe le pratiche accettabili.

Nel tuo caso è possibile che match non abbia mai un valore assegnato, quindi l'errore del compilatore.

1

Si ha il blocco if() lì che inizializza la variabile 'match' se la condizione è soddisfatta. In tal caso, la corrispondenza è un oggetto che rappresenta il blocco effettivo nella memoria.

Tuttavia, se la condizione if() non viene soddisfatta, non esiste alcun blocco "else" che esegue l'inizializzazione predefinita della variabile "match", nel qual caso si tenterà di accedere a un valore non inizializzato oggetto, che fallirebbe.

è possibile aggirare il problema:

  1. Come commentato, di default l'inizializzazione 'match' prima del ciclo for.
  2. Aggiunta di una condizione "altro" predefinita dopo il ciclo for.

Fortunatamente se si sta lavorando su un IDE, questo viene indicato come eccezione di compilazione.

Problemi correlati