Instruções de nível superior - programas sem Main métodos

Não é necessário incluir explicitamente um Main método em um projeto de aplicativo de console. Em vez disso, você pode usar o recurso de instruções de nível superior para minimizar o código que você precisa escrever.

As instruções de nível superior permitem que você escreva código executável diretamente na raiz de um arquivo, eliminando a necessidade de encapsular seu código em uma classe ou método. Isso significa que você pode criar programas sem a cerimônia de uma Program aula e um Main método. Nesse caso, o compilador gera uma Program classe com um método de ponto de entrada para o aplicativo. O nome do método gerado não Mainé , é um detalhe de implementação que seu código não pode referenciar diretamente.

Aqui está um arquivo Program.cs que é um programa C# completo em C# 10:

Console.WriteLine("Hello World!");

As instruções de nível superior permitem escrever programas simples para pequenos utilitários, como o Azure Functions e as Ações do GitHub. Eles também tornam mais simples para os novos programadores de C# começar a aprender e escrever código.

As seções a seguir explicam as regras sobre o que você pode e o que não pode fazer com instruções de nível superior.

Apenas um ficheiro de nível superior

Um aplicativo deve ter apenas um ponto de entrada. Um projeto pode ter apenas um arquivo com instruções de nível superior. Colocar instruções de nível superior em mais de um arquivo em um projeto resulta no seguinte erro de compilador:

CS8802 Apenas uma unidade de compilação pode ter instruções de nível superior.

Um projeto pode ter qualquer número de arquivos de código-fonte adicionais que não tenham instruções de nível superior.

Nenhum outro ponto de entrada

Você pode escrever um Main método explicitamente, mas ele não pode funcionar como um ponto de entrada. O compilador emite o seguinte aviso:

CS7022 O ponto de entrada do programa é o código global; ignorando o ponto de entrada 'Main()'.

Em um projeto com instruções de nível superior, você não pode usar a opção de compilador -main para selecionar o ponto de entrada, mesmo que o projeto tenha um ou mais Main métodos.

using Diretivas

Se você incluir using diretivas, elas devem vir primeiro no arquivo, como neste exemplo:

using System.Text;

StringBuilder builder = new();
builder.AppendLine("The following arguments are passed:");

// Display the command line arguments using the args variable.
foreach (var arg in args)
{
    builder.AppendLine($"Argument={arg}");
}

Console.WriteLine(builder.ToString());

// Return a success code.
return 0;

Espaço de nomes global

As instruções de nível superior estão implicitamente no namespace global.

Namespaces e definições de tipo

Um arquivo com instruções de nível superior também pode conter namespaces e definições de tipo, mas elas devem vir depois das instruções de nível superior. Por exemplo:

MyClass.TestMethod();
MyNamespace.MyClass.MyMethod();

public class MyClass
{
    public static void TestMethod()
    {
        Console.WriteLine("Hello World!");
    }
}

namespace MyNamespace
{
    class MyClass
    {
        public static void MyMethod()
        {
            Console.WriteLine("Hello World from MyNamespace.MyClass.MyMethod!");
        }
    }
}

args

As instruções de nível superior podem fazer referência à args variável para acessar quaisquer argumentos de linha de comando que foram inseridos. A args variável nunca é nula, mas é Length zero se nenhum argumento de linha de comando for fornecido. Por exemplo:

if (args.Length > 0)
{
    foreach (var arg in args)
    {
        Console.WriteLine($"Argument={arg}");
    }
}
else
{
    Console.WriteLine("No arguments");
}

await

Você pode chamar um método assíncrono usando await. Por exemplo:

Console.Write("Hello ");
await Task.Delay(5000);
Console.WriteLine("World!");

Código de saída do processo

Para retornar um int valor quando o aplicativo terminar, use a return instrução como faria em um Main método que retorna um intarquivo . Por exemplo:

string? s = Console.ReadLine();

int returnValue = int.Parse(s ?? "-1");
return returnValue;

Método do ponto de entrada implícito

O compilador gera um método para servir como o ponto de entrada do programa para um projeto com instruções de nível superior. A assinatura do método depende se as instruções de nível superior contêm a await palavra-chave ou a return instrução. A tabela a seguir mostra como seria a assinatura do método, usando o nome Main do método na tabela por conveniência.

O código de nível superior contém Assinatura implícita Main
await e return static async Task<int> Main(string[] args)
await static async Task Main(string[] args)
return static int Main(string[] args)
Não await ou return static void Main(string[] args)

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

Especificação do recurso - Instruções de nível superior