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");
}
}
| Элемент | Назначение |
|---|---|
static | CLR вызывает метод без экземпляра |
void | Не возвращает значение (код выхода — Environment.Exit или return int в других сигнатурах) |
string[] args | Аргументы командной строки |
Библиотека vs исполняемый файл
Тип проекта задаётся в .csproj:
<OutputType>Exe</OutputType> <!-- консольное приложение -->
<OutputType>Library</OutputType> <!-- DLL для ссылок -->
| Тип | Точка входа | Запуск |
|---|---|---|
| Exe / консоль | Main или top-level | dotnet run, двойной клик по .exe |
| Library | Нет | Только через ссылку из другого проекта |
| ASP.NET Core | Сгенерированный Main + хост Kestrel | dotnet run на веб-проекте |
Импорт namespace из DLL не запускает Main — поведение ближе к Java, чем к Python с кодом верхнего уровня.
Аналог Python __main__
В Python один .py может быть и модулем, и скриптом — проверка __name__. В C# роли обычно разделены проектами:
- Class library — функции, классы, сервисы (без
Main). - Console / Web —
Program.csс запуском.
Демо-код в библиотеке держат в тестах (xUnit, NUnit) или в отдельном консольном проекте, а не в public static инициализаторах.
StartupObject и несколько Main
Если в сборке несколько классов с Main, в .csproj указывают:
<StartupObject>MyApp.Program</StartupObject>
Иначе компилятор сообщит об неоднозначности.
Когда что использовать
| Задача | Подход |
|---|---|
| Учебный консольный пример | Top-level statements |
| Unity / WPF / большой legacy | Явный Main или сгенерированный шаблон |
| Переиспользуемая логика | Class library + ссылка из exe |
| Веб API | WebApplication.CreateBuilder в Program.cs |
Блок if name == "main" в одном файле ≈ отдельный exe-проект с Program.cs. Общая логика ≈ class library без точки входа.
Дальше по разделу
| Тема | Статья |
|---|---|
Проекты, dotnet run | C# - язык программирования платформы .NET — C# и .NET |
| ASP.NET точка входа | ASP.NET - фреймворк для веб-приложений — ASP.NET |
| Структура решения | раздел .NET platform |