На самом деле, ситуация с процедурным блоком в C# не так проста. Процедурный блок имеет сложную структуру; в него могут быть вложены другие блоки, связанные с операторами выбора, цикла и так далее. В каждом таком блоке, в свою очередь, допустимы вложения блоков. В каждом внутреннем блоке допустимы объявления переменных. Переменные, объявленные во внутренних блоках, локализованы именно в этих блоках, их область видимости и время жизни определяются этими блоками. Локальные переменные начинают существовать при достижении вычислений в блоке точки объявления и перестают существовать, когда процесс вычисления завершает выполнение операторов блока. Можно полагать, что для каждого такого блока выполняется так называемый пролог и эпилог. В прологе локальным переменным отводится память, в эпилоге память освобождается. Фактически ситуация сложнее, поскольку выделение памяти, а следовательно, и начало жизни переменной, объявленной в блоке, происходит не в момент входа в блок, а лишь тогда, когда достигается точка объявления локальной переменной.
Давайте обратимся к примеру. В класс
///
/// Анализ области видимости переменных ///
///
public void ScopeVar(int x)
{
//int x=0;
int у =77; string s = name;
if (s=="Точка1")
{
int u = 5; int v = u+y; x +=1;
Console.WriteLine("y= {0}; u={1};
v={2}; x={3 } ", у, u,v,x);
}
else
{
int u= 7; int v= u+y;
Console.WriteLine("y= {0}; u={1}; v={2}", y,u,v);
}
// Console.WriteLine("y= {0}; u={1}; v={2}",y,u,v);
// Локальные переменные не могут быть статическими.
// static int Count = 1;
// Ошибка: использование sum до объявления
// Console.WriteLine("х= {0}; sum ={1}", x,sum);
int i;long sum =0;