Языки программирования

Области видимости переменных в C#

Область видимости переменной (её ещё называют контекстом переменной) — это фрагмент кода, в пределах которого будет доступна данная переменная. Область видимости в C# определяются следующими правилами:

  • Поле или переменная — член класса находится в области видимости до тех пор, пока в этой области находится содержащий это поле класс;
  • Локальная переменная находится в области видимости до тех пор, пока закрывающая фигурная скобка не укажет конец блока операторов или метода, в котором она объявлена;
  • Локальная переменная, объявленная в операторах цикла for, while или подобных им, видима в пределах тела цикла.

Рассмотрим несколько примеров:
for (int i = 0; i < 6; i++)
{
  Console.Write(" {0}", i);
}       // здесь заканчивается область видимости i
int k = 6 * i;  // оператор не будет выполнен
После закрывающей скобки цикла for переменная i больше не будет "видна", следовательно, последний оператор не будет выполнен. Рассмотрим еще один пример:
public static int Main()
{
int n = 15;
for (int i = 0; i < 5; i++)
{
int n = 10;  // ошибка
Console.WriteLine(n + i);
}
return 0;
}
Переменная n, определённая перед началом цикла for, будет находиться в области видимости до тех пор, пока не завершится метод Main(). Вторая переменная n якобы объявлена в контексте цикла, но он является вложенным в контекст метода Main(), поэтому компилятор не может различить эти две переменные и не допустит объявления второй переменной с именем n.

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

Язык C# делает различие между переменными, объявленными на уровне поля и переменными, объявленные в методах (локальными переменными). В качестве примера рассмотрим следующий код:
using System;
namespace ConsoleApplication
{
  class Program
   {
     static string name = "Max";

     public static void Main()
     {
      string name = "Bob";
      Console.WriteLine(name);
      return;
     }
   }
}
Когда вы запустите этот код, вы увидите строку "Bob". Приоритет у локальных переменных выше, чем у членов класса.
Самоучитель по C#