Каждая переменная доступна в рамках определенного контекста или области видимость. Вне этого контекста переменная уже не существует.
Существуют различные контексты:
Контекст класса. Переменные, определенные на уровне класса, доступны в любом методе этого класса. Их еще называют глобальными переменными или полями
Контекст метода. Переменные, определенные на уровне метода, являются локальными и доступны только в рамках данного метода. В других методах они недоступны
Контекст блока кода. Переменные, определенные на уровне блока кода, также являются локальными и доступны только в рамках данного блока. Вне своего блока кода они не доступны.
Например, пусть код программы определен следующим образом:
Person tom = new(); tom.PrintName(); tom.PrintSurname(); class Person // начало контекста класса { string type = "Person"; // переменная уровня класса public void PrintName() // начало контекста метода PrintName { string name = "Tom"; // переменная уровня метода { // начало контекста блока кода string shortName = "Tomas"; // переменная уровня блока кода Console.WriteLine(type); // в блоке доступна переменная класса Console.WriteLine(name); // в блоке доступна переменная окружающего метода Console.WriteLine(shortName);// в блоке доступна переменная этого же блока } // конец контекста блока кода, переменная shortName уничтожается Console.WriteLine(type); // в методе доступна переменная класса Console.WriteLine(name); // в методе доступна переменная этого же метода //Console.WriteLine(shortName); //так нельзя, переменная c определена в блоке кода //Console.WriteLine(surname); //так нельзя, переменная surname определена в другом методе } // конец контекста метода PrintName, переменная name уничтожается public void PrintSurname() // начало контекста метода PrintSurname { string surname = "Smith"; // переменная уровня метода Console.WriteLine(type); // в методе доступна переменная класса Console.WriteLine(surname); // в методе доступна переменная этого же метода } // конец конекста метода PrintSurname, переменная surname уничтожается } // конец контекста класса, переменная type уничтожается
Здесь определенно четыре переменных: type, name, shortName и surname. Каждая из них существует в своем контексте. Переменная type
существует в контексте всего класса Person и доступна в любом месте и блоке кода в методах PrintName и PrintSurname.
Переменная name
существует только в рамках метода PrintName. Также как и переменная surname
существует в
рамках метода PrintSurname. В методе PrintName мы не можем обратиться к переменной surname
, так как она в другом контексте.
Переменная shortName
существует только в блоке кода, границами которого являются открывающая и закрывающая фигурные
скобки. Вне его границ переменная shortName не существует и к ней нельзя обратиться.
Нередко границы различных контекстов можно ассоциировать с открывающимися и закрывающимися фигурными скобками, как в данном случае, которые задают пределы блока кода, метода, класса.
При работе с переменными надо учитывать, что локальные переменные, определенные в методе или в блоке кода, скрывают переменные уровня класса, если их имена совпадают:
class Person { string name = "Tom"; // переменная уровня класса public void PrintName() { string name = "Tomas"; // переменная уровня метода скрывает переменную уровня класса Console.WriteLine(name); // Tomas } }
При объявлении переменных также надо учитывать, что в одном контексте нельзя определить несколько переменных с одним и тем же именем.