Перейти к основному содержимому

Main и top-level statements — точка входа в .NET

Разработчику

CLR запускает программу с точки входа. В консольном приложении это метод Main или top-level statements в Program.cs. В class library точки входа нет — сборку подключают другие проекты.

См. также: C# — язык платформы .NET · Python — if name == "main".


Top-level statements (.NET 6+)

Шаблон dotnet new console создаёт короткий Program.cs:

Console.WriteLine("Приложение запущено");

Компилятор генерирует скрытый класс Program с методом Main. Это современный эквивалент «кода запуска» без лишней обёртки.

Аргументы командной строки доступны через неявный массив args (если он объявлен в файле):

foreach (var arg in args)
Console.WriteLine(arg);

Классический static void Main

По-прежнему допустим и нужен в учебниках и legacy-коде:

internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello");
}
}
ЭлементНазначение
staticCLR вызывает метод без экземпляра
voidНе возвращает значение (код выхода — Environment.Exit или return int в других сигнатурах)
string[] argsАргументы командной строки

Библиотека vs исполняемый файл

Тип проекта задаётся в .csproj:

<OutputType>Exe</OutputType> <!-- консольное приложение -->
<OutputType>Library</OutputType> <!-- DLL для ссылок -->
ТипТочка входаЗапуск
Exe / консольMain или top-leveldotnet run, двойной клик по .exe
LibraryНетТолько через ссылку из другого проекта
ASP.NET CoreСгенерированный Main + хост Kestreldotnet run на веб-проекте

Импорт namespace из DLL не запускает Main — поведение ближе к Java, чем к Python с кодом верхнего уровня.


Аналог Python __main__

В Python один .py может быть и модулем, и скриптом — проверка __name__. В C# роли обычно разделены проектами:

  • Class library — функции, классы, сервисы (без Main).
  • Console / WebProgram.cs с запуском.

Демо-код в библиотеке держат в тестах (xUnit, NUnit) или в отдельном консольном проекте, а не в public static инициализаторах.


StartupObject и несколько Main

Если в сборке несколько классов с Main, в .csproj указывают:

<StartupObject>MyApp.Program</StartupObject>

Иначе компилятор сообщит об неоднозначности.


Когда что использовать

ЗадачаПодход
Учебный консольный примерTop-level statements
Unity / WPF / большой legacyЯвный Main или сгенерированный шаблон
Переиспользуемая логикаClass library + ссылка из exe
Веб APIWebApplication.CreateBuilder в Program.cs
Сравнение с Python

Блок if name == "main" в одном файле ≈ отдельный exe-проект с Program.cs. Общая логика ≈ class library без точки входа.


Дальше по разделу

ТемаСтатья
Проекты, dotnet run1 — C# и .NET
ASP.NET точка входа451 — ASP.NET
Структура решенияраздел .NET platform

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").