2010-09-02 18 views
6

C# başlığındaki belleğimi yenilemek için C# tuşuna basıyorum (C++ uygulamasında arkaplan). - Kitaba göre, değişken metin başlatılmadı nedeniyle, (sadece döngü içinde başlatıldı - ve değerDeğişken kapsamı C#

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

yukarıdaki pasajı derlemek olmaz:

kitapta bu pasajı rastladı döngü bloğu sonlandırıldığında son atanmış olur ..

Bir L değerine atanan değerin neden R değerinin oluşturulduğunun kapsamı dışında bırakıldığını anlayamıyorum. L değeri hala kapsam dahilindedir

Herkes değişken metnin neden döngüde atanan değeri kaybettiğini açıklayabilir mi?

+2

Birinin nedenini açıklamasını istedi ... – DaveHogan

+0

Sry, benim hatam. +1 o zaman, her şeyin kapsamda kalacağı için hangi değerin kaybolması gerektiğini bilmesem bile. düzenleme: tekrar, L ve R değerleri nedir? : D – atamanroman

+0

@fielding: lvalue genellikle atanabilecek bir değer anlamına gelir, bir ifade herhangi bir ifade, bkz http://en.wikipedia.org/wiki/Value_%28computer_science%29 –

cevap

12

Değişken, değerini "kaybetmez". Derleyici hatası alırsınız, çünkü text'un atanmamış olduğu bir kod yolu vardır (derleyici, döngü gövdesinin girilip girilmediğini belirleyemez. Bu, overly-complex rules in the compiler'u önlemek için bir kısıtlamadır).

Sadece null için text ayarlayarak bunu düzeltebilirsiniz: Ben de for deyimi içine döngü indeksi değişken i ilanını taşındı

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

Not. Bu en iyi uygulamadır çünkü değişken mümkün olan en küçük deklarasyon kapsamında beyan edilmelidir.

+0

İyi bir açıklama (+1), fakat komik 5 cevaptan 3'ü doğru "kaybet" yerine "gevşek" yazıyor :-) – Gorpik

+0

@Gorpik: Düzeltme için teşekkürler. Anadili olmayan bir kişi olarak benim için bu hakkı elde etmek her zaman zordur;) –

+0

+1: cevap şu ifadede kapsanmıştır: "metnin atandığı bir kod yolu var ..." – morpheous

4

text Eğer for ya da olmasın, girecek eğer derleyici bilmediği için bunu for çıkıldıktan sonra değer, ama kaybeder çünkü bu değil derlemek etmez ve ardından text başlatıldı edilmeyecektir değilse.

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.