Области действия могут быть вложенными. Например, всякий раз, когда создается кодовый блок, одновременно образуется и новая, вложенная область действия. В этом случае внешняя область действия охватывает внутреннюю область. Это означает, что локальные переменные, объявленные во внешней области действия, будут видимы для кода во внутренней области действия. Но обратное не справедливо: локальные переменные, объявленные во внутренней области действия, не будут видимы вне этой области.

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

// Продемонстрировать область действия кодового блока,

using System;

class ScopeDemo {

  static void Main() {

    int x; // Эта переменная доступна для всего кода внутри метода Main().

    x = 10;

    if (x == 10)    {  // начать новую область действия

      int у = 20; // Эта переменная доступна только в данном кодовом блоке.

      // Здесь доступны обе переменные, х и у.

      Console.WriteLine("х и у: " + x + " " + у);

      x = у * 2;

    }

    // у = 100; // Ошибка! Переменна у здесь недоступна.

    //А переменная х здесь по-прежнему доступна.

    Console.WriteLine("х равно " + x) ;

  }

}

Как поясняется в комментариях к приведенной выше программе, переменная х объявляется в начале области действия метода Main(), и поэтому она доступна для всего последующего кода в пределах этого метода. В блоке условного оператора if объявляется переменная у. А поскольку этот кодовый блок определяет свою собственную область действия, то переменная у видима только для кода в пределах данного блока. Именно поэтому строка line у = 100 ;, находящаяся за пределами этого блока, закомментирована. Если удалить находящиеся перед ней символы комментария (//), то во время компиляции программы произойдет ошибка, поскольку переменная у невидима за пределами своего кодового блока. В то же время переменная х может использоваться в блоке условного оператора i f, поскольку коду из этого блока, находящемуся во вложенной области действия, доступны переменные, объявленные в охватывающей его внешней области действия.

Переменные могут быть объявлены в любом месте кодового блока, но они становятся действительными только после своего объявления. Так, если объявить переменную в начале метода, то она будет доступна для всего остального кода в пределах этого метода. А если объявить переменную в конце блока, то она окажется, по существу, бесполезной, поскольку не будет доступной ни одному коду.

Если в объявление переменной включается инициализатор, то такая переменная инициализируется повторно при каждом входе в тот блок, в котором она объявлена. Рассмотрим следующий пример программы.

// Продемонстрировать время существования переменной.

using System;

class VarlnitDemo {

  static void Main() {

    int x;

    for(x = 0; x < 3; x++)    {

      int у = -1; // Переменная у инициализируется при каждом входе в блок.

      Console.WriteLine("у равно: " + у); // Здесь всегда выводится -1

      у = 100;

      Console.WriteLine("у теперь равно: " + у);

    }

  }

}

Ниже приведен результат выполнения этой программы.

У равно: -1

У теперь равно: 100

У равно: -1

У теперь равно: 100

У равно: -1

У теперь равно: 100

Как видите, переменная у повторно инициализируется одним и тем же значением -1 при каждом входе во внутренний цикл for. И несмотря на то, что после этого цикла ей присваивается значение 100, оно теряется при повторной ее инициализации.

В языке C# имеется еще одна особенность соблюдения правил области действия: несмотря на то, что блоки могут быть вложены, ни у одной из переменных из внутренней области действия не должно быть такое же имя, как и у переменной из внешней области действия. В приведенном ниже примере программы предпринимается попытка объявить две разные переменные с одним и тем же именем, и поэтому программа не может быть скомпилирована.

/*

Перейти на страницу:

Похожие книги