Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Среда выполнения вызывает Main метод при запуске приложения C#. Метод Main — это точка входа приложения C#.
Программа C# может иметь только одну точку входа. Если у вас несколько классов с методом Main , при компиляции программы необходимо использовать параметр компилятора StartupObject , чтобы указать, какой Main метод служит точкой входа. Дополнительные сведения см. в разделе StartupObject (параметры компилятора C#). В следующем примере отображается число аргументов командной строки в качестве первого действия:
class TestClass
{
static void Main(string[] args)
{
Console.WriteLine(args.Length);
}
}
Инструкции верхнего уровня можно также использовать в одном файле в качестве точки входа для приложения. Как и в методе Main , операторы верхнего уровня могут возвращать значения и получать доступ к аргументам командной строки. Для получения дополнительной информации, смотрите инструкции верхнего уровня. В следующем примере используется foreach цикл для отображения аргументов командной строки с помощью args переменной, а в конце программы возвращается код успешного выполнения (0):
using System.Text;
StringBuilder builder = new();
builder.AppendLine("The following arguments are passed:");
foreach (var arg in args)
{
builder.AppendLine($"Argument={arg}");
}
Console.WriteLine(builder.ToString());
return 0;
Начиная с C# 14, программы могут быть файловыми приложениями, где один файл содержит программу. Приложения на основе файлов выполняются с помощью команды dotnet <file.cs>или с помощью #!/usr/bin/env dotnet run директивы в качестве первой строки (только оболочки Unix).
Обзор
- Метод
Main— это точка входа исполняемой программы. Это место, где начинается и заканчивается управление программой. - Необходимо объявить
Mainвнутри класса или структуры. Включающееclassможет бытьstatic. - Аргумент
Mainдолжен иметь значениеstatic. -
Mainможет иметь любой модификатор доступа. -
Mainможет возвращатьvoid,int,TaskилиTask<int>. - Если и только если
MainвозвращаетTaskилиTask<int>, объявлениеMainможет включать модификаторasync. Это правило специально исключаетasync void Mainметод. - Метод
Mainможно объявить с параметромstring[], содержащим аргументы командной строки, или без него. При использовании Visual Studio для создания приложений Windows можно добавить параметр вручную или использовать GetCommandLineArgs() метод для получения аргументов командной строки. Параметры — аргументы командной строки без индексирования. В отличие от C и C++, имя программы не рассматривается как первый аргумент командной строки вargsмассиве, но это первый элемент GetCommandLineArgs() метода.
В следующем списке показаны наиболее распространенные Main объявления:
static void Main() { }
static int Main() { }
static void Main(string[] args) { }
static int Main(string[] args) { }
static async Task Main() { }
static async Task<int> Main() { }
static async Task Main(string[] args) { }
static async Task<int> Main(string[] args) { }
В предыдущих примерах не указывается модификатор доступа, поэтому они неявно private по умолчанию. Можно указать любой явный модификатор доступа.
Совет
Используя возвращаемые типы async, Task или Task<int>, вы упрощаете программный код, когда консольным приложениям необходимо запускать и выполнять асинхронные операции в Main.
Возвращаемые значения Main()
Вы можете возвратить int из метода Main, определив метод одним из следующих способов:
Main декларация |
Код метода Main |
|---|---|
static int Main() |
Без использования args или await |
static int Main(string[] args) |
Используется args, но не await |
static async Task<int> Main() |
Используется await, но не args |
static async Task<int> Main(string[] args) |
С использованием args и await |
Если возвращаемое значение из Main не используется, возвращение void или Task допускает немного более простой код.
Main декларация |
Код метода Main |
|---|---|
static void Main() |
Без использования args или await |
static void Main(string[] args) |
Используется args, но не await |
static async Task Main() |
Используется await, но не args |
static async Task Main(string[] args) |
С использованием args и await |
Однако возврат int или Task<int> позволяет программе передавать информацию о своем состоянии другим программам и скриптам, которые вызывают исполняемый файл.
В следующем примере показано, как можно получить доступ к коду завершения для процесса.
В этом примере используются программы командной строки .NET Core. Если вы не знакомы с инструментами командной строки .NET Core, их можно узнать в этой статье о начале работы.
Создайте приложение, выполнив команду dotnet new console. Измените Main метод в Program.cs следующим образом:
class MainReturnValTest
{
static int Main()
{
//...
return 0;
}
}
Не забудьте сохранить эту программу как MainReturnValTest.cs.
При выполнении программы в Windows система сохраняет любое значение, возвращаемое функцией Main в переменной среды. Эту переменную среды можно получить с помощью ERRORLEVEL пакетного файла или $LastExitCode из PowerShell.
Вы можете создать приложение с помощью команды dotnet CLIdotnet build .
Затем создайте скрипт PowerShell для запуска приложения и отображения результата. Вставьте следующий код в текстовый файл и сохраните его под именем test.ps1 в папке проекта. Запустите скрипт PowerShell, введя команду test.ps1 в командной строке PowerShell.
Так как код возвращает ноль, пакетный файл сообщает об успешном выполнении. Однако если изменить MainReturnValTest.cs, чтобы вернуть ненулевое значение, а затем перекомпилировать программу, последующее выполнение скрипта PowerShell сообщает о сбое.
dotnet run
if ($LastExitCode -eq 0) {
Write-Host "Execution succeeded"
} else
{
Write-Host "Execution Failed"
}
Write-Host "Return value = " $LastExitCode
Execution succeeded
Return value = 0
Значения, возвращаемые асинхронным методом main
При объявлении возвращаемого значения для async компилятор создает стандартный код для вызова асинхронных методов в Main.
class Program
{
static async Task<int> Main(string[] args)
{
return await AsyncConsoleWork();
}
private static async Task<int> AsyncConsoleWork()
{
return 0;
}
}
В обоих примерах основной текст программы находится в теле AsyncConsoleWork() метода.
Преимущество объявления Main как async заключается в том, что компилятор всегда генерирует правильный код.
Если точка входа приложения возвращает Task или Task<int>, то компилятор создает новую точку входа, которая вызывает метод точки входа, объявленный в коде приложения. Предположим, что эта точка входа называется $GeneratedMain. В этом случае компилятор создает следующий код для этих точек входа:
-
static Task Main()приводит к тому, что компилятор выдает эквивалентprivate static void $GeneratedMain() => Main().GetAwaiter().GetResult();. -
static Task Main(string[])приводит к тому, что компилятор выдает эквивалентprivate static void $GeneratedMain(string[] args) => Main(args).GetAwaiter().GetResult();. -
static Task<int> Main()приводит к тому, что компилятор выдает эквивалентprivate static int $GeneratedMain() => Main().GetAwaiter().GetResult();. -
static Task<int> Main(string[])приводит к тому, что компилятор выдает эквивалентprivate static int $GeneratedMain(string[] args) => Main(args).GetAwaiter().GetResult();.
Примечание.
Если в примерах используется async модификатор Main метода, компилятор создает тот же код.
Аргументы командной строки
Вы можете передавать аргументы в метод Main, определив метод одним из следующих способов:
Main декларация |
Код метода Main |
|---|---|
static void Main(string[] args) |
Нет возвращаемого значения или await |
static int Main(string[] args) |
Возвращает значение, но не использует await |
static async Task Main(string[] args) |
Использует await, но не возвращает значение |
static async Task<int> Main(string[] args) |
Возвращает значение и использует await |
Если аргументы не используются, можно пропустить args из объявления метода, чтобы упростить код.
Main декларация |
Код метода Main |
|---|---|
static void Main() |
Нет возвращаемого значения или await |
static int Main() |
Возвращает значение, но не использует await |
static async Task Main() |
Использует await, но не возвращает значение |
static async Task<int> Main() |
Возвращает значение и использует await |
Примечание.
Вы также можете использовать Environment.CommandLine или Environment.GetCommandLineArgs получать доступ к аргументам командной строки из любой точки в консоли или приложении Windows Forms. Чтобы включить аргументы командной строки в объявлении метода в Main приложении Windows Forms, необходимо вручную изменить объявление Main. Код, созданный конструктором Windows Forms, создает Main без входного параметра.
Параметр метода Main — это массив String, представляющий аргументы командной строки. Обычно вы определяете, существуют ли аргументы путем тестирования Length свойства, например:
if (args.Length == 0)
{
System.Console.WriteLine("Please enter a numeric argument.");
return 1;
}
Совет
Массив args не может иметь значение NULL. Поэтому доступ к свойству Length можно получить без проверки значения NULL.
Строковые аргументы также можно преобразовать в числовые типы с помощью класса Convert или метода Parse. Например, следующая инструкция преобразует string в число long с помощью метода Parse:
long num = Int64.Parse(args[0]);
Можно также использовать тип long, который является псевдонимом для Int64.
long num = long.Parse(args[0]);
Также можно использовать метод класса ConvertToInt64 для того же:
long num = Convert.ToInt64(s);
Дополнительные сведения см. в разделах Parse и Convert.
Совет
Анализ аргументов командной строки может быть сложным. Рекомендуется использовать библиотеку System.CommandLine (в настоящее время в бета-версии), чтобы упростить процесс.
В следующем примере показано использование аргументов командной строки в консольном приложении. Приложение принимает один аргумент времени выполнения, преобразует аргумент в целое число и вычисляет факториал числа. Если не указано никаких аргументов, приложение выдает сообщение, поясняющее правильное использование программы.
Чтобы скомпилировать и запустить приложение из командной строки, выполните следующие действия.
- Вставьте следующий код в любой текстовый редактор и сохраните файл как текстовый файл с именем Factorial.cs.
public class Functions
{
public static long Factorial(int n)
{
// Test for invalid input.
if ((n < 0) || (n > 20))
{
return -1;
}
// Calculate the factorial iteratively rather than recursively.
long tempResult = 1;
for (int i = 1; i <= n; i++)
{
tempResult *= i;
}
return tempResult;
}
}
class MainClass
{
static int Main(string[] args)
{
if (args.Length == 0)
{
Console.WriteLine("Please enter a numeric argument.");
Console.WriteLine("Usage: Factorial <num>");
return 1;
}
int num;
bool test = int.TryParse(args[0], out num);
if (!test)
{
Console.WriteLine("Please enter a numeric argument.");
Console.WriteLine("Usage: Factorial <num>");
return 1;
}
long result = Functions.Factorial(num);
if (result == -1)
Console.WriteLine("Input must be >= 0 and <= 20.");
else
Console.WriteLine($"The Factorial of {num} is {result}.");
return 0;
}
}
В начале метода Main программа проверяет, были ли предоставлены входные аргументы, сравнивая длину аргумента args с 0 и отображает справку, если аргументы не найдены.
Если указаны аргументы (args.Length больше 0), программа пытается преобразовать входные аргументы в числа. В этом примере создается исключение, если аргумент не является числом.
После вычисления факториала (хранящегося в result переменной типа long), подробный результат выводится в зависимости от переменной result .
С экрана Пуск или из меню Пуск откройте окно Командной строки разработчика Visual Studio, а затем перейдите в папку, содержащую созданный вами файл.
Чтобы скомпилировать приложение, введите следующую команду:
dotnet buildЕсли приложение не имеет ошибок компиляции, процесс сборки создает двоичный файл с именем Factorial.dll.
Введите приведенную ниже команду для вычисления факториала числа 3:
dotnet run -- 3Если ввести 3 в командной строке в качестве аргумента программы, вывод будет следующим:
The factorial of 3 is 6.
Примечание.
При запуске приложения в Visual Studio укажите аргументы командной строки на странице отладки конструктора проектов.
Спецификация языка C#
Дополнительные сведения см. в спецификации языка C#. Спецификация языка является авторитетным источником синтаксиса и использования языка C#.