2010-09-02 27 views
6

Przeczytam początek C#, aby odświeżyć moją pamięć na C# (tło w C++).Zmienna zakres w C#

natknąłem tego fragmentu w książce:

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

Fragment powyżej nie zostanie skompilowany - bo według książki, tekst zmienna nie jest zainicjowana (tylko zainicjowany w pętli - a wartością ostatni przypisany do niego jest tracony, gdy blok pętli zostanie zakończony

Nie mogę zrozumieć, dlaczego wartość przypisana do wartości L została utracona tylko dlatego, że zakres, w którym została utworzona wartość R został zakończony - nawet jeśli Wartość L jest nadal w zakresie.Czy ktoś może wyjaśnić, dlaczego zmienny tekst traci wartość przypisaną w pętli ?.

+2

Poprosił kogoś o wyjaśnienie, dlaczego ... – DaveHogan

+0

Sry, moja wina. +1 wtedy, nawet jeśli nie wiem, która wartość powinna zostać utracona, ponieważ wszystko pozostanie w zasięgu. edytuj: znowu, czym są wartości L i R? : D – atamanroman

+0

@fielding: lvalue zwykle oznacza wartość, do której można przypisać, rwartość jest dowolnym wyrażeniem, zobacz http://en.wikipedia.org/wiki/Value_%28computer_science%29 –

Odpowiedz

12

Zmienna nie "traci" jej wartości. Wystąpił błąd kompilatora, ponieważ istnieje ścieżka kodowa, do której nie jest przypisana text (kompilator nie może określić, czy treść pętli jest wprowadzana, czy też nie. Jest to ograniczenie, aby uniknąć overly-complex rules in the compiler).

Można to naprawić poprzez proste ustawienie text do 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); 

pamiętać, że również przeniesiony deklarację zmiennej indeksu pętli i do rachunku for. Jest to najlepsza praktyka, ponieważ zmienna powinna być zadeklarowana w najmniejszym możliwym zakresie deklaracji.

+0

Dobre wyjaśnienie (+1), ale zabawne, jak 3 z 5 odpowiedzi zapisują "luźne" zamiast poprawnej "stracić" :-) – Gorpik

+0

@Gorpik: Dzięki za poprawkę. Dla mnie jako osoby spoza ojczystego języka zawsze jest to trudne;) –

+0

+1: odpowiedź jest zawarta w tym stwierdzeniu: "istnieje ścieżka kodowa, w której tekst nie jest przypisany do ..." – morpheous

4

nie nie skompilować, ponieważ text traci to wartość po wyjściu for, ale ponieważ kompilator nie wie, czy będzie wprowadzić for czy nie, a jeśli nie, to text nie zostanie zainicjowany.

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.