C# время жизни переменной в try finally
Я получил следующий код
Почему x в finally-block имеет значение 5 вместо того, чтобы быть "уже определенным" или иметь значение по умолчанию 0?
5 ответов
Я думаю, вы установили точку останова в finally
и посмотрел на x
. x
не имеет значения в соответствии со спецификацией языка C#, но отладчик, вероятно, посмотрел на место хранения, что первый x
показал вам его значение.
в реальном коде вы не сможете прочитать из x
на finally
.
отладчик не подчиняется правилам языка.
жизнь x
внутри {...}
блок, try
в вашем случае; однако, так как нет ноль-инициализации of локальные переменные в .Net следующий x
содержит корзина, бывшая x
стоимостью
try
{
int x = 5;
}
finally
{
// x is re-declared; since x is local it contains trash;
// former x was aquired at the stack, so .Net just moves stack pointer
// and doesn't remove former x value
int x;
...
}
http://msdn.microsoft.com/en-us/library/aa691170 (v=против 71).aspx
...Локальная переменная автоматически не инициализируется и так не имеет значения по умолчанию значение...
http://msdn.microsoft.com/en-us/library/aa664742 (v=против 71).aspx
...Область действия локальной переменной, объявленной в объявлении локальной переменной - это блок, в котором декларация происходит...
вы наверное используйте отладчик visual studio, который ретранслирует имена переменных для просмотра значений и показывает неправильное значение в таких запутанных случаях.
область действия переменной x
ограничен try
блок только,
да отладчик показывает значение 5, но
если вы пытаетесь использовать x
переменная вы столкнетесь с проблемами, которые вы упомянули.
Попробуйте Это:
finally
{
int x;
Console.Write(x); //error use of unassigned local variable
}
почему x в finally-block значение 1 вместо того, чтобы быть "уже определено" или имеет значение по умолчанию 0?
то, что вы видите, - это отладчик, связывающий символы. Он вообще не имеет значения, и на самом деле, если вы попытаетесь его использовать, вы получите ошибку неназначенной переменной.
теперь, почему он не показывает, как уже определено, это другой вопрос. Ответ в том, что {}
определение пространства. (В C# определяются переменные на уровне филиалов, а не на уровне функций). Они находятся в двух разных пространствах объявления, и поэтому это разрешено. Первый x
не может разлиться туда, где второй x
определяется.
что ты иная, чем
void foo () {
var x = 2;
if (true){
var x = 3;
}
}
что запрещено.