2010-09-02 27 views
6

Sto leggendo Beginning C# per aggiornare la memoria su C# (background in C++).Ambito variabile in C#

mi sono imbattuto in questo frammento nel libro:

int i; 
string text; 
for (i = 0; i < 10; i++) 
{ 
    text = "Line " + Convert.ToString(i); 
    Console.WriteLine("{0}", text); 
} 
Console.WriteLine("Last text output in loop: {0}", text); 

Il frammento di cui sopra non compilerà - perché, secondo il libro, il testo variabile non è inizializzata, (inizializzato solo nel ciclo - e il valore l'ultimo assegnato ad esso viene perso quando si esce dal blocco di loop

Non riesco a capire perché il valore assegnato a un valore L viene perso solo perché l'ambito in cui è stato creato il valore R è stato chiuso, anche se il Il valore L è ancora incluso.

Qualcuno può spiegare perché il testo variabile perde il valore assegnato nel ciclo ?.

+2

Ha chiesto a qualcuno di spiegare perché ... – DaveHogan

+0

Sry, colpa mia. +1 poi, anche se non capisco quale valore dovrebbe perdersi dato che tutto rimarrebbe nella portata. modifica: ancora, quali sono i valori L e R? : D – atamanroman

+0

@fielding: lvalue di solito significa un valore che può essere assegnato a, un valore di rvalue è qualsiasi espressione, vedere http://en.wikipedia.org/wiki/Value_%28computer_science%29 –

risposta

12

La variabile non "perde" il suo valore. Si ottiene l'errore del compilatore perché esiste un percorso di codice in cui non è assegnato text (il compilatore non può determinare se il corpo del ciclo è stato immesso o meno. Questa è una restrizione da evitare overly-complex rules in the compiler).

È possibile risolvere questo problema semplicemente impostando text a null:

string text = null; 
for (int i = 0; i < 10; i++) 
{ 
    text = "Line " + Convert.ToString(i); 
    Console.WriteLine("{0}", text); 
} 
Console.WriteLine("Last text output in loop: {0}", text); 

Nota che ho anche spostato la dichiarazione della variabile indice del ciclo i nella dichiarazione for. Questa è la best practice perché la variabile dovrebbe essere dichiarata nel più piccolo ambito di dichiarazione possibile.

+0

Buona spiegazione (+1), ma divertente come 3 su 5 risposte scrivano "sciolto" invece del corretto "perdere" :-) – Gorpik

+0

@Gorpik: Grazie per la correzione. Per me come madrelingua è sempre difficile ottenere questo diritto;) –

+0

+1: la risposta è incapsulata in questa dichiarazione: "c'è un percorso di codice in cui il testo non è assegnato a ..." – morpheous

4

Questo non non viene compilato perché text perde il suo valore dopo l'uscita for, ma perché il compilatore non sa se si entra for o no, e se non allora non sarà inizializzato text.

0
 // Your code has compile time error - Use of unassigned local variable 'text' 
    //'text' variable hold last value from loop On Execution time not on Compile time.