Partilhar via


Argumentos main() e de linha de comando

Gorjeta

Novo no desenvolvimento de software? Começa primeiro pelos tutoriais para começar . Esses tutoriais usam instruções de topo, o que é mais simples para aplicações novas.

A trabalhar com uma base de código já existente? Muitas aplicações existentes utilizam um método explícito Main . Este artigo explica como funciona e como utilizá-lo de forma eficaz.

Quando inicias uma aplicação C#, o runtime chama o Main método. O Main método é o ponto de entrada de um aplicativo C#.

Um programa de C# só pode ter um ponto de entrada. Se tiver mais do que uma classe com um Main método, deve usar a opção compilador StartupObject ao compilar o seu programa para especificar qual Main o método que serve como ponto de entrada. Para obter mais informações, consulte StartupObject (C# Compiler Options). O exemplo seguinte mostra o número de argumentos da linha de comandos como a sua primeira ação:

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

Descrição geral

O Main método é o ponto de entrada de um programa executável. Quando o teu programa inicia, o runtime é chamado Main antes de qualquer outro código ser executado. Quando Main regressa, o programa termina. Declaras Main com estas regras:

  • Deve declarar-se Main numa classe ou estrutura. O anexo class pode ser static.
  • Main deve ser static.
  • Main Pode ter qualquer modificador de acesso.
  • Main pode devolver void, int, Task, ou Task<int>.
  • Se e somente se Main retornar a Task ou Task<int>, a declaração de Main pode incluir o async modificador. Esta regra exclui especificamente um async void Main método.
  • Pode declarar o Main método com ou sem um string[] parâmetro que contenha argumentos de linha de comandos. Quando usa o Visual Studio para criar aplicações Windows, pode adicionar o parâmetro manualmente ou então usar o GetCommandLineArgs() método para obter os argumentos da linha de comandos. Os parâmetros são argumentos de linha de comandos indexados a zero. Ao contrário de C e C++, o nome do programa não é tratado como o primeiro argumento de linha de comando na args matriz, mas é o GetCommandLineArgs() primeiro elemento do método.

A lista seguinte mostra as permutações das Main declarações:

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) { }

Os exemplos anteriores não especificam um modificador de acesso, portanto, eles são implicitamente private por padrão. Podes especificar qualquer modificador de acesso explícito.

A tabela seguinte resume todas as assinaturas válidas Main e quando usar cada uma:

Main Declaração Utilizações args contém await Devolve o código de saída
static void Main() No No No
static int Main() No No Sim
static void Main(string[] args) Sim No No
static int Main(string[] args) Sim No Sim
static async Task Main() No Sim No
static async Task<int> Main() No Sim Sim
static async Task Main(string[] args) Sim Sim No
static async Task<int> Main(string[] args) Sim Sim Sim

Escolha a assinatura mais simples que se adeque às suas necessidades. Se não precisares de argumentos de linha de comandos, omite o string[] args parâmetro. Se não precisares de devolver um código de saída, usa void ou Task. Se precisar de chamar métodos assíncronos, use async com um tipo de Task ou Task<int> retorno.

Valores de retorno Main()

Quando retorna int ou Task<int>, o seu programa pode enviar informações de estado para outros programas ou scripts que executam o executável. Um valor de retorno de 0 normalmente significa sucesso, e um valor diferente de zero significa que há um erro.

O exemplo seguinte devolve um código de saída:

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

Depois de executar o programa, pode verificar o código de saída. No PowerShell, usa $LastExitCode. Num ficheiro em lotes ou num script shell, use %ERRORLEVEL%.

Se o seu Main método usa await, declare-o como async com um Task ou Task<int> tipo de retorno. O runtime chama Main e espera que o retorno Task seja concluído antes de o processo sair. O tipo de retorno não pode ser void ou int porque o async modificador exige um tipo de retorno que o tempo de execução pode aguardar —void e int não representa trabalho em curso, pelo que o processo pode sair antes do término das operações assíncronas. Task Use quando não precisar de um código de saída, ou Task<int> quando precisares:

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

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

Argumentos de linha de comando

Inclua um string[] args parâmetro na sua Main declaração para aceitar argumentos de linha de comandos. Se não precisares deles, omite o parâmetro. O args parâmetro é um String array que nunca é nulo — se não forem fornecidos argumentos, é Length zero.

Pode converter argumentos de cadeia para outros tipos usando Parse ou Convert:

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

Gorjeta

A análise de argumentos de linha de comando pode ser complexa. Considere usar a biblioteca System.CommandLine para simplificar o processo.

Para um exemplo prático, veja Como mostrar argumentos de linha de comandos.

Especificação da linguagem C#

Para obter mais informações, consulte a Especificação da Linguagem C# . A especificação da linguagem é a fonte definitiva para a sintaxe e o uso do C#.