2010-09-02 4 views
6

Ich lese Anfang C#, um meinen Speicher auf C# (Hintergrund in C++) zu aktualisieren.Variablenbereich in C#

Ich kam in diesem Schnipsel in dem Buch:

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); 

Das Snippet oben wird nicht kompiliert - denn nach dem Buch, der variable Text nicht initialisiert wird, (nur in der Schleife initialisiert - und der Wert zuletzt zugewiesen ist verloren, wenn der Schleifenblock beendet wird

Ich kann nicht verstehen, warum der einem L - Wert zugewiesene Wert verloren geht, nur weil der Bereich, in dem der R - Wert erstellt wurde, verlassen wurde - obwohl der L-Wert ist immer noch im Bereich.

Kann jemand erklären, warum der variable Text den in der Schleife zugewiesenen Wert verliert ?.

+2

Er bat um jemanden zu erklären, warum ... – DaveHogan

+0

Sry, meine Schuld. +1 dann, auch wenn ich nicht bekomme, welcher Wert verloren gehen sollte, da alles in Reichweite bleiben würde. edit: wieder, was sind L und R Werte? : D – atamanroman

+0

@fielding: Lvalue bedeutet in der Regel einen Wert, der zugewiesen werden kann, ein Rvalue ist ein beliebiger Ausdruck, siehe http://en.wikipedia.org/wiki/Value_%28computer_science%29 –

Antwort

12

Die Variable verliert ihren Wert nicht. Sie erhalten den Compilerfehler, da ein Codepfad vorhanden ist, dem text nicht zugewiesen ist (der Compiler kann nicht bestimmen, ob der Schleifenkörper eingegeben wird oder nicht. Dies ist eine Einschränkung, die vermieden werden soll overly-complex rules in the compiler).

Sie können dieses Problem beheben, indem Sie einfach text zu null Einstellung:

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); 

Bitte beachte, dass ich auch die Erklärung des Schleifenindex Variable i in die for Anweisung bewegt. Dies ist eine bewährte Vorgehensweise, da die Variable im kleinstmöglichen Deklarationsbereich deklariert werden sollte.

+0

Gute Erklärung (+1), aber lustig, wie 3 von 5 Antworten "lose" anstatt der korrekten "verlieren" schreiben :-) – Gorpik

+0

@Gorpik: Danke für die Korrektur. Für mich als Nicht-Muttersprachler ist es immer schwer, das richtig zu machen;) –

+0

+1: Die Antwort ist in dieser Aussage eingekapselt: "Es gibt einen Code-Pfad, wo Text nicht zugeordnet ist ..." – morpheous

4

nicht kompiliert Dies nicht wegen text Wert es verliert, nachdem Sie for verlassen, sondern weil Compiler weiß nicht, ob Sie for oder nicht, geben wird, und wenn Sie dann werden nicht text nicht initialisiert.

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.