Переменная область в C # - PullRequest
       1

Переменная область в C #

6 голосов
/ 02 сентября 2010

Я читаю Начало C #, чтобы обновить память на C # (фон в 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);

Приведенный выше фрагмент не будет скомпилирован - поскольку, согласно книге, текст переменной не инициализируется (только инициализируется в цикле), а последнее назначенное ему значение теряется при выходе из блока цикла.

Я не могу понять, почему значение, присвоенное значению L, теряется только потому, что область, в которой было создано значение R, была закрыта - даже если значение L все еще находится в области действия.

Может кто-нибудь объяснить, почему переменная text теряет значение, присвоенное в цикле?.

Ответы [ 4 ]

12 голосов
/ 02 сентября 2010

Переменная не «теряет» свое значение. Вы получаете ошибку компилятора, потому что есть путь к коду, где text не назначен (компилятор не может определить, введено ли тело цикла или нет. Это ограничение, чтобы избежать слишком сложных правил в компиляторе ).

Вы можете это исправить, просто установив text в 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);

Обратите внимание, что я также переместил объявление индексной переменной цикла i в оператор for. Это лучшая практика, потому что переменная должна быть объявлена ​​в наименьшей возможной области объявления.

4 голосов
/ 02 сентября 2010

Это не компилируется не потому, что text теряет свое значение после выхода из for, а потому, что компилятор не знает, введете ли вы for или нет, а если нет, то text не будет инициализирован.

0 голосов
/ 02 сентября 2010
     // 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.
0 голосов
/ 02 сентября 2010

Извините, но значение не теряется на моей машине ...

Здесь может быть несколько актуален вопрос о том, что компилятор позволяет инициализировать, а что нет:

Инициализация полей экземпляра против локальных переменных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...