Полное руководство по языку программирования С# 14 и платформе .NET 10 / Классы, структуры и пространства имен

Область видимости (контекст) переменных и констант

Начальный ⏱ 3 мин чтения 👁 2 🕓 обновлено 11.08.2026

Каждая переменная доступна в рамках определенного контекста или области видимость. Вне этого контекста переменная уже не существует.

Существуют различные контексты:

  • Контекст класса. Переменные, определенные на уровне класса, доступны в любом методе этого класса. Их еще называют глобальными переменными или полями

  • Контекст метода. Переменные, определенные на уровне метода, являются локальными и доступны только в рамках данного метода. В других методах они недоступны

  • Контекст блока кода. Переменные, определенные на уровне блока кода, также являются локальными и доступны только в рамках данного блока. Вне своего блока кода они не доступны.

Например, пусть код программы определен следующим образом:


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
    } 
}

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

Дополнительные материалы

Проверь себя

📋 Тест по теме «Область видимости (контекст) переменных и констант» Тест по теме

Практические задания

Лёгкое Ручная проверка Заполните пропуск в коде (1)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

_____ 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 уничтожается
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (2)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

class Person 
{
    string _____ = "Tom";             // переменная уровня класса
    public void PrintName() 
    {
        string name = "Tomas";      // переменная уровня метода скрывает переменную уровня класса

        Console.WriteLine(name);    // Tomas
    } 
}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (3)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

Person _____ = 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 уничтожается
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (4)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

class Person 
{
    string name = "Tom";             // переменная уровня класса
    public void PrintName() 
    {
        string name = "Tomas";      // переменная уровня метода скрывает переменную уровня класса

        _____.WriteLine(name);    // Tomas
    } 
}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (5)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

Person tom = new();
tom._____();
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 уничтожается
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (1)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

Person tom = new();
tom._____();
tom.PrintSurname();

class Person                            // начало контекста класса
{
    string type = "Person";             // переменная уровня класса
    public void PrintName()             // начало контекста метода PrintName
    {
        string name = "Tom";            // переменная уровня метода

        {                               // начало контекста блока кода
            string shortName = "Tomas"; // переменная уровня блока кода
            Console._____(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 уничтожается
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (2)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

class Person 
{
    string name = "_____";             // переменная уровня класса
    public void PrintName() 
    {
        string name = "_____";      // переменная уровня метода скрывает переменную уровня класса

        Console.WriteLine(name);    // Tomas
    } 
}
Войдите, чтобы отправить решение
Сложное Ручная проверка Объясните и модифицируйте пример из урока «Область видимости (контекст) переменных и констант»
+30 XP

Опишите своими словами, что делает приведённый пример кода из урока «Область видимости (контекст) переменных и констант», и предложите одно осмысленное изменение (например, другое входное значение или дополнительное условие). Приведите итоговый код.

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 уничтожается
Войдите, чтобы отправить решение
Сложное Ручная проверка Найдите потенциальную проблему в коде урока «Область видимости (контекст) переменных и констант»
+30 XP

Изучите приведённый фрагмент кода и опишите, при каких входных данных или условиях он может сработать не так, как ожидается (граничный случай, отсутствие проверки и т.п.). Предложите исправленный вариант.

class Person 
{
    string name = "Tom";             // переменная уровня класса
    public void PrintName() 
    {
        string name = "Tomas";      // переменная уровня метода скрывает переменную уровня класса

        Console.WriteLine(name);    // Tomas
    } 
}
Войдите, чтобы отправить решение
Мини-проект Ручная проверка Мини-проект по теме «Область видимости (контекст) переменных и констант»
+50 XP

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

Войдите, чтобы отправить решение
Домашнее задание Ручная проверка Домашнее задание по теме «Область видимости (контекст) переменных и констант»
+25 XP

Напишите собственную небольшую программу, применяющую материал темы «Область видимости (контекст) переменных и констант». Используйте не менее одной конструкции, показанной в примерах урока. Прикрепите код решения и краткое описание того, что он делает.

Войдите, чтобы отправить решение

Обсуждение (0)

Войдите, чтобы оставить комментарий.