Compartilhar via


Main() e argumentos de linha de comando

Dica

Novo no desenvolvimento de software? Comece primeiro com os tutoriais de Introdução . Esses tutoriais usam instruções de nível superior, o que é mais simples para novos aplicativos.

Trabalhando com uma base de código existente? Muitos aplicativos existentes usam um método explícito Main . Este artigo explica como ele funciona e como usá-lo com eficiência.

Quando você inicia um aplicativo C#, o runtime chama o Main método. O método Main é o ponto de entrada de um aplicativo C#.

Um programa C# pode ter apenas um ponto de entrada. Se você tiver mais de uma classe com um Main método, deverá usar a opção do compilador StartupObject ao compilar seu programa para especificar qual Main método serve como o ponto de entrada. Para obter mais informações, consulte StartupObject (opções de compilador do C#). O exemplo a seguir exibe o número de argumentos de linha de comando como sua primeira ação:

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

Visão geral

O Main método é o ponto de entrada de um programa executável. Quando o programa é iniciado, o runtime chama Main antes de qualquer outro código ser executado. Quando Main retorna, o programa termina. Você declara Main com estas regras:

  • Você deve declarar Main dentro de uma classe ou struct. A envolvente class pode ser static.
  • Main deve ser static.
  • Main pode ter qualquer modificador de acesso.
  • Mainpode retornarvoid, intou TaskTask<int>.
  • Se e somente se Main retornar um Task ou Task<int>, a declaração de Main pode incluir o async modificador. Essa regra exclui especificamente um async void Main método.
  • Você pode declarar o Main método com ou sem um string[] parâmetro que contenha argumentos de linha de comando. Ao usar o Visual Studio para criar aplicativos do Windows, você pode adicionar o parâmetro manualmente ou usar o GetCommandLineArgs() método para obter os argumentos de linha de comando. Parâmetros são argumentos de linha de comando 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 primeiro elemento do GetCommandLineArgs() método.

A lista a seguir mostra as permutações de 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. Você pode especificar qualquer modificador de acesso explícito.

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

Declaração Main Usa args Contém await Retorna 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 atenda às suas necessidades. Se você não precisar de argumentos de linha de comando, omita o string[] args parâmetro. Se você não precisar retornar um código de saída, use void ou Task. Se você precisar chamar métodos assíncronos, use async com um tipo de retorno Task ou Task<int>.

Valores de retorno de Main()

Quando você retorna int ou Task<int>, seu programa pode enviar informações de status para outros programas ou scripts que executam o executável. Um valor retornado geralmente 0 significa êxito, e um valor diferente de zero significa que há um erro.

O exemplo a seguir retorna um código de saída:

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

Depois de executar o programa, você pode verificar o código de saída. No ambiente do PowerShell, use $LastExitCode. Em um arquivo em lote ou script de shell, use %ERRORLEVEL%.

Se o método Main usa await, declare-o como async com um tipo de retorno Task ou Task<int>. O runtime chama Main e aguarda a conclusão de Task antes que o processo termine. O tipo de retorno não pode ser void ou int porque o async modificador requer um tipo de retorno que o runtime pode aguardar e voidint não representa o trabalho em andamento, portanto, o processo pode sair antes que as operações assíncronas sejam concluídas. Use Task quando você não precisar de um código de saída ou Task<int> quando o fizer:

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 em sua Main declaração para aceitar argumentos de linha de comando. Se você não precisar deles, omita o parâmetro. O args parâmetro é uma String matriz que nunca é nula– se nenhum argumento for fornecido, ele Length será zero.

Você pode converter argumentos de cadeia de caracteres em outros tipos usando Parse ou Convert:

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

Dica

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

Para obter um exemplo funcional, consulte Como exibir argumentos de linha de comando.

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 de C#.