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