Область видимости (контекст) переменных
Каждая переменная доступна в рамках определенного контекста или области видимость. Вне этого контекста переменная уже не существует.
Существуют различные контексты:
Контекст класса. Переменные, определенные на уровне класса, доступны в любом методе этого класса
Контекст метода. Переменные, определенные на уровне метода, являются локальными и доступны только в рамках данного метода. В других методах они недоступны
Контекст блока кода. Переменные, определенные на уровне блока кода, также являются локальными и доступны только в рамках данного блока. Вне своего блока кода они не доступны.
Например, пусть класс Program определен следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | class Program // начало контекста класса { static int a = 9; // переменная уровня класса static void Main( string [] args) // начало контекста метода Main { int b = a - 1; // переменная уровня метода { // начало контекста блока кода int c = b - 1; // переменная уровня блока кода } // конец контекста блока кода, переменная с уничтожается //так нельзя, переменная c определена в блоке кода //Console.WriteLine(c); //так нельзя, переменная d определена в другом методе //Console.WriteLine(d); Console.Read(); } // конец контекста метода Main, переменная b уничтожается void Display() // начало контекста метода Display { // переменная a определена в контексте класса, поэтому доступна int d = a + 1; } // конец конекста метода Display, переменная d уничтожается } // конец контекста класса, переменная a уничтожается |
Здесь определенно четыре переменных: a, b, c, d. Каждая из них существует в своем контексте. Переменная a
существует в контексте всего класса Program и доступна в любом месте и блоке кода в методах Main и Display.
Переменная b
существует только в рамках метода Main. Также как и переменная d
существует в рамках метода Display. В методе Main мы не можем обратиться
к переменной d
, так как она в другом контексте.
Переменная c
существует только в блоке кода, границами которого являются открывающая и закрывающая фигурные скобки. Вне его границ переменная c не существует и к ней нельзя обратиться.
Нередко границы различных контекстов можно ассоциировать с открывающимися и закрывающимися фигурными скобками, как в данном случае, которые задают пределы блока кода, метода, класса.
При работе с переменными надо учитывать, что локальные переменные, определенные в методе или в блоке кода, скрывают переменные уровня класса, если их имена совпадают:
1 2 3 4 5 6 7 8 9 10 | class Program { static int a = 9; // переменная уровня класса static void Main( string [] args) { int a = 5; // скрывает переменную a, которая объявлена на уровне класса Console.WriteLine(a); // 5 } } |
При объявлении переменных также надо учитывать, что в одном контексте нельзя определить несколько переменных с одним и тем же именем.