Метод Main
Программы из прошлых уроков состояли из одних инструкций. Но в учебниках, на собеседованиях и в чужом коде вы часто встретите ту же программу в другом виде — внутри класса и метода Main.
Представьте кулинарную книгу с десятками рецептов. Чтобы приготовить обед, повару нужно знать, с какой страницы начать, поэтому на нужной странице лежит закладка «начинать отсюда». У программы на C# тоже есть такая закладка — метод Main.
Вот программа «Hello, World!» в классической форме:
class Program
{
static void Main()
{
Console.WriteLine("Hello, World!"); // Hello, World!
}
}Давайте разберём её по строкам:
class Programобъявляет класс с именемProgram. Класс — именованная оболочка для кода, и здесь он нужен только как обёртка дляMain.- Фигурные скобки
{и}отмечают начало и конец: всё между ними принадлежит классу. В C# каждую такую скобку принято ставить на отдельной строке. static void Main()— заголовок методаMain.- Тело метода — инструкции между его фигурными скобками. Здесь инструкция одна: вызов
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 года, и в проектах, где точку входа хотят видеть явно.
На собеседовании часто спрашивают: «Что такое инструкции верхнего уровня и во что их превращает компилятор?» Хороший ответ называет три факта:
- Начиная с C# 9 точку входа можно не объявлять и писать инструкции прямо в файле.
- Компилятор сам строит вокруг них класс
Programи метод-точку входа. - Такие инструкции могут стоять только в одном файле программы.
Частая ошибка
Метод назвали main с маленькой буквы:
class Program
{
static void main() // ✗
{
Console.WriteLine("Hello, World!");
}
}error CS5001: Program does not contain a static 'Main' method suitable for an entry pointC# различает регистр, поэтому main — обычный метод с другим именем, а точку входа компилятор ищет только под именем Main. Слово Program в начале сообщения означает всю программу, а не класс: текст будет тем же при любом имени класса. Так часто ошибаются те, кто писал на Java или C, где этот метод называют main.
Главное
- Точка входа — метод, с которого начинается выполнение; в C# это
static void Main()внутри класса. - С C# 9 точку входа можно не объявлять: инструкции верхнего уровня пишут прямо в файле.
- Компилятор сам строит вокруг инструкций верхнего уровня класс
Programи метод-точку входа. - Инструкции верхнего уровня могут стоять только в одном файле программы и идут в нём первыми.