Перейти к содержимому
Теория · Первая программа · урок 6 из 7

Метод Main

Программы из прошлых уроков состояли из одних инструкций. Но в учебниках, на собеседованиях и в чужом коде вы часто встретите ту же программу в другом виде — внутри класса и метода Main.

Представьте кулинарную книгу с десятками рецептов. Чтобы приготовить обед, повару нужно знать, с какой страницы начать, поэтому на нужной странице лежит закладка «начинать отсюда». У программы на C# тоже есть такая закладка — метод Main.

Вот программа «Hello, World!» в классической форме:

C#
class Program
{
    static void Main()
    {
        Console.WriteLine("Hello, World!"); // Hello, World!
    }
}

Давайте разберём её по строкам:

  1. class Program объявляет класс с именем Program. Класс — именованная оболочка для кода, и здесь он нужен только как обёртка для Main.
  2. Фигурные скобки { и } отмечают начало и конец: всё между ними принадлежит классу. В C# каждую такую скобку принято ставить на отдельной строке.
  3. static void Main() — заголовок метода Main.
  4. Тело метода — инструкции между его фигурными скобками. Здесь инструкция одна: вызов Console.WriteLine.

Метод и точка входа

Метод — именованный блок инструкций. Заголовок static void Main() состоит из четырёх частей:

  • static — метод принадлежит самому классу Program, и среда выполнения может вызвать его сразу, ничего не создавая;
  • void — метод ничего не возвращает, он только выполняет свои инструкции;
  • Main — имя метода, обязательно с большой буквы;
  • () — пустые скобки: при вызове методу ничего не передают.

Точка входа — метод, с которого начинается выполнение программы. В C# это Main: среда выполнения находит его и выполняет его инструкции сверху вниз. Когда они заканчиваются, программа завершается.

Здесь закладка из кулинарной книги перестаёт работать. В книгу можно вложить две закладки, а точка входа у программы одна. Если объявить Main в двух классах, компилятор откажется выбирать сам и выдаст ошибку CS0017.

Инструкции верхнего уровня

Начиная с C# 9, вышедшего в 2020 году, обёртку можно не писать. Инструкции, записанные прямо в файле, вне класса и метода, называют инструкциями верхнего уровня. Программа из одной строки Console.WriteLine("Hello, World!"); написана именно так.

Компилятор сам строит вокруг таких инструкций класс Program и метод-точку входа. Называется этот метод <Main>$: такое имя нельзя написать в коде, поэтому оно не столкнётся с вашими. Работает он так же, как Main: среда выполнения вызывает его при запуске.

Об инструкциях верхнего уровня нужно помнить три вещи:

  • они могут стоять только в одном файле программы, ведь точка входа одна: второй такой файл даёт ошибку CS8802;
  • в своём файле они идут первыми, а объявление класса выше них — ошибка CS8803;
  • это обычный способ писать код, а не особый режим: проект, который создаёт команда dotnet new console, начинается с файла Program.cs из одной строки Console.WriteLine("Hello, World!");.

Какую форму выбрать

Обе формы после компиляции дают одно и то же: класс с методом-точкой входа. Инструкции верхнего уровня короче, поэтому их выбирают для небольших программ, и все примеры этого курса написаны так. Классический Main встречается в коде, написанном до 2020 года, и в проектах, где точку входа хотят видеть явно.

На собеседовании часто спрашивают: «Что такое инструкции верхнего уровня и во что их превращает компилятор?» Хороший ответ называет три факта:

  1. Начиная с C# 9 точку входа можно не объявлять и писать инструкции прямо в файле.
  2. Компилятор сам строит вокруг них класс Program и метод-точку входа.
  3. Такие инструкции могут стоять только в одном файле программы.

Частая ошибка

Метод назвали main с маленькой буквы:

C#
class Program
{
    static void main() // ✗
    {
        Console.WriteLine("Hello, World!");
    }
}
TEXT
error CS5001: Program does not contain a static 'Main' method suitable for an entry point

C# различает регистр, поэтому main — обычный метод с другим именем, а точку входа компилятор ищет только под именем Main. Слово Program в начале сообщения означает всю программу, а не класс: текст будет тем же при любом имени класса. Так часто ошибаются те, кто писал на Java или C, где этот метод называют main.

Главное

  • Точка входа — метод, с которого начинается выполнение; в C# это static void Main() внутри класса.
  • С C# 9 точку входа можно не объявлять: инструкции верхнего уровня пишут прямо в файле.
  • Компилятор сам строит вокруг инструкций верхнего уровня класс Program и метод-точку входа.
  • Инструкции верхнего уровня могут стоять только в одном файле программы и идут в нём первыми.