Поделиться через


Main() и аргументы командной строки

Совет

Вы новичок в разработке программного обеспечения? Сначала начните с учебников для начинающих. В этих руководствах используются инструкции верхнего уровня, которые проще для новых приложений.

Работа с существующей базой кода? Многие существующие приложения используют явный Main метод. В этой статье объясняется, как она работает и как эффективно использовать ее.

При запуске приложения C# среда выполнения вызывает Main метод. Метод Main — это точка входа приложения C#.

Программа C# может иметь только одну точку входа. Если у вас несколько классов с методом Main , при компиляции программы необходимо использовать параметр компилятора StartupObject , чтобы указать, какой Main метод служит точкой входа. Дополнительные сведения см. в разделе StartupObject (параметры компилятора C#). В следующем примере отображается число аргументов командной строки в качестве первого действия:

class TestClass
{
    static void Main(string[] args)
    {
        Console.WriteLine(args.Length);
    }
}

Обзор

Метод Main — это точка входа исполняемой программы. При запуске программы среда выполнения вызывает Main перед выполнением любого другого кода. Когда Main возвращается, программа заканчивается. Вы объявляете 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 по умолчанию. Можно указать любой явный модификатор доступа.

В следующей таблице перечислены все допустимые Main подписи и когда они используются.

Main декларация Использует args Содержит await Возвращает код выхода
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) Да Да Да

Выберите простую подпись, которая соответствует вашим потребностям. Если аргументы командной строки не нужны, опустите string[] args параметр. Если вам не нужно возвращать код выхода, используйте void или Task. Если необходимо вызвать асинхронные методы, используйте async с возвращаемым типом Task или Task<int>.

Возвращаемые значения Main()

Когда вы возвращаетесь int или Task<int>, ваша программа может отправлять сведения о состоянии в другие программы или скрипты, которые запускают исполняемый файл. Возвращаемое значение обычно означает успешность, а ненулевое значение 0 означает, что возникает ошибка.

В следующем примере возвращается код выхода:

class MainReturnValTest
{
    static int Main()
    {
        //...
        return 0;
    }
}

После запуска программы можно проверить код выхода. В PowerShell используйте $LastExitCode. В пакетном файле или скрипте оболочки используйте %ERRORLEVEL%.

Если ваш метод Main использует await, объявите его как async с возвращаемым типом Task или Task<int>. Среда выполнения вызывает Main и ожидает завершения Task, прежде чем процесс завершится. Тип возвращаемого значения не может быть void или int, потому что async модификатор требует возвращаемого типа, который среда выполнения может ожидать — void и int не представляют текущую работу, из-за чего процесс может завершиться раньше, чем асинхронные операции. Используйте Task , если вам не нужен код выхода или Task<int> когда вы делаете следующее:

class Program
{
    static async Task<int> Main(string[] args)
    {
        return await AsyncConsoleWork();
    }

    private static async Task<int> AsyncConsoleWork()
    {
        return 0;
    }
}

Аргументы командной строки

Включите параметр string[] args в объявление Main, чтобы принимать аргументы командной строки. Если их не требуется, опустите параметр. Параметр args — это String массив, который никогда не имеет значения NULL, если аргументы не указаны, его Length значение равно нулю.

Строковые аргументы можно преобразовать в другие типы с помощью Parse или Convert:

long num = long.Parse(args[0]);

Совет

Анализ аргументов командной строки может быть сложным. Рекомендуется использовать библиотеку System.CommandLine для упрощения процесса.

Рабочий пример см. в разделе "Отображение аргументов командной строки".

Спецификация языка C#

Дополнительные сведения см. в спецификации языка C#. Спецификация языка является авторитетным источником синтаксиса и использования языка C#.