Загрузка...

Область видимости

Напишите метод с именем mark и одним параметром: static void mark(int n). Внутри фигурных скобок напишите этот параметр через Console.WriteLine(n);. Из Main вызовите mark(4);. Экран должен показать одну строку: 4. Имя n существует только внутри mark. Если вы попробуете писать n из Main, сборка откажется. Эта граница — какие имена видит метод — то, чему учит эта страница. Оставьте публичный класс с именем Pine.

Имена, которые остаются внутри метода

На странице перегрузки несколько методов paint делили одно имя, но держали разные списки параметров. Здесь фокус уже: один метод, одно имя параметра и место, где это имя может появиться. Параметр — имя, которое принадлежит методу, который его объявил. Вне фигурных скобок этого метода имени уже нет.
Откройте файл Pine. Имя класса остаётся Pine. Эта страница не переименовывает тип. Удалите любой остаток демо paint, если такая форма — всё, что ещё есть в Main. Удалите любой остаток twice. Удалите любую строку ReadLine. В файле, который вы оставляете, нет ожидания ввода.
Вне Main, но всё ещё внутри фигурных скобок класса, напишите static void mark(int n). Тело содержит одну строку записи: Console.WriteLine(n);. На этой странице оставьте void. Вы смотрите на видимость, а не на возвращаемые значения. Сохраните файл перед запуском. Полная первая программа — в следующем блоке.

Файл, который вы оставляете

Это версия, которую вы запускаете первой. Main держит вызов. mark держит строку записи, которая использует n.

mark writes its parameter

csharp
using System;

public class Pine
{
    public static void Main()
    {
        mark(4);
    }

    static void mark(int n)
    {
        Console.WriteLine(n);
    }
}

Читайте сверху. using System; готовит короткие имена. public class Pine именует тип. public static void Main() — место, где среда выполнения стартует. Вызов mark(4) отправляет 4 в параметр n. Внутри mark выражение Console.WriteLine(n) пишет 4. Когда mark заканчивается, имя n тоже заканчивается. Main никогда не держал имя n. Число 4 пересекло вызов как значение. Имя n не перешло в Main. Одна строка на экране: 4.

Запустите через dotnet run. Программа пишет одну строку и останавливается. Она не ждёт, пока вы наберёте текст. Если dotnet run ждёт, в файле ещё есть ReadLine. Удалите эту строку и оставьте mark(4); плюс метод mark выше. Экран показывает 4. Если экран показывает ok, всё ещё выполняется остаточный вызов paint("ok"). Если экран показывает букву n, строка записи в кавычках: Console.WriteLine("n");. Не переустанавливайте .NET SDK из‑за экрана с неверной строкой.

Пройдите один полный запуск по порядку. C# стартует в Main. Вызов mark(4) отправляет 4 в параметр n. Внутри mark выражение WriteLine(n) пишет 4. Когда mark заканчивается, имя n тоже заканчивается. Main никогда не держал имя n. Число 4 пересекло вызов как значение. Имя n не перешло в Main.
Если после вызова добавить внутри Main строку Console.WriteLine(n);, сборка сообщит, что не находит имя n. Эта ошибка — урок в работе: n никогда не объявляли в Main. Исправьте, убрав эту строку из Main, или объявив другое имя в Main, если там нужен локальный. Не ждите, что параметр из mark сам появится в Main.

Локальное имя рядом с параметром

Внутри mark вы также можете объявить новое имя, которое не является параметром. Это локальное имя живёт только между фигурными скобками mark. Частая надежда новичка — что имя, объявленное в Main, автоматически видно внутри каждого метода класса. На этой форме это не так. Если в Main есть int room = 4;, а mark пытается писать room, не получив его, сборка не находит room внутри mark. Исправление — передать значение: mark(room);, при этом mark по‑прежнему объявлен как mark(int n).

Передайте локальное из Main в mark

Объявите int room = 4; внутри Main. Вызовите mark(room);. Внутри mark продолжайте писать n. Экран по‑прежнему показывает 4. Локальное имя в Main — room. Имя параметра в mark — n. Это разные имена в разных местах. Путешествует значение 4.

pass room into mark

csharp
using System;

public class Pine
{
    public static void Main()
    {
        int room = 4;
        mark(room);
    }

    static void mark(int n)
    {
        Console.WriteLine(n);
    }
}

Это второй файл. Он учит той же видимости с локальным в Main. Запустите dotnet run. Вы по‑прежнему видите одну строку: 4. Если изменить room на 9 и не трогать тело метода, экран показывает 9. Метод всё ещё пишет то значение, которое пришло в n. Main может писать и room, если добавить Console.WriteLine(room); в Main — это имя принадлежит там. Main по‑прежнему не может писать n. После того как вы увидели форму с room, верните сохранённый файл с одним вызовом, если хотите сохранить именно его: mark(4); в Main.
Если mark объявляет своё локальное — например int tag = 1; внутри скобок — этот tag невидим для Main. Попытка Console.WriteLine(tag); в Main падает по той же причине, что и запись n из Main. Фигурные скобки mark — стена для имён, объявленных внутри них.

Что защищает стена

Прочитайте разделение простыми словами. Имена, объявленные в Main, остаются в Main, пока вы не передадите их значения в вызов. Имена, объявленные в mark — параметры и локальные — остаются в mark. Вызов несёт значения, а не сами имена. Перегрузка с предыдущей страницы — другой навык: несколько методов с одним общим именем метода. Область видимости — о том, где имя переменной или параметра может появиться в исходнике.
Остаток демо paint может сидеть в том же файле и путать экран, если Main всё ещё вызывает paint("ok"). Очистите Main до вызова mark, который вы тестируете. Не вкладывайте mark внутрь скобок Main. Методы сидят внутри класса, рядом с Main.
Запись Console.WriteLine("n"); в Main пишет букву n в кавычках. Она не пишет параметр. Держите Console.WriteLine(n) внутри mark, когда хотите значение, пришедшее через вызов. Запись mark(); с пустыми скобками падает, пока заголовок говорит mark(int n) — вызов должен отправить int, будь то литерал вроде 4 или локальное вроде room.

Вы можете написать mark(int n), писать n внутри этого метода и держать n вне Main. Вы можете объявить room в Main и передать room в mark. Экран показывает значение, которое пересекло вызов. Имена сами по себе не протекают сквозь скобки. Следующая страница — recursion, где метод вызывает сам себя с меньшим аргументом, пока условие остановки не оборвёт цепочку.

Экран держит значение, которое пересекло

Файл, который вы оставляете, пишет 4, когда Main вызывает mark(4);. Имя n стоит в строке записи внутри mark, и буква n не появляется на экране как печатная метка, пока вы не взяли её в кавычки. Вложение mark внутрь Main — не форма, которую строит этот урок.

🧠 Проверьте Свои Знания

Готов к Началу

Проверьте Свои Знания

Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему

❓
6
Вопросы
🎯
70%
Для Прохождения
♾️
∞
Время
🔄
∞
Попытки

📝 Инструкции

  • Внимательно прочитайте каждый вопрос
  • Выберите лучший ответ на каждый вопрос
  • Вы можете пересдавать тест столько раз, сколько захотите
  • Ваш прогресс будет показан вверху