Область видимости (контекст) переменных
Каждая переменная доступна в рамках определенного контекста или области видимость. Вне этого контекста переменная уже не существует.
Существуют различные контексты:
Контекст класса. Переменные, определенные на уровне класса, доступны в любом методе этого класса. Их еще называют глобальными переменными или полями
Контекст метода. Переменные, определенные на уровне метода, являются локальными и доступны только в рамках данного метода. В других методах они недоступны
Контекст блока кода. Переменные, определенные на уровне блока кода, также являются локальными и доступны только в рамках данного блока. Вне своего блока кода они не доступны.
Например, пусть класс Program определен следующим образом:
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
}
}
При объявлении переменных также надо учитывать, что в одном контексте нельзя определить несколько переменных с одним и тем же именем.