Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Instruções de nível superior - programas sem
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 top-level statements 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 é possível criar programas sem a formalidade de uma Program classe 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 o seu código não pode referenciar diretamente.
Aqui está um arquivo Program.cs que é um programa C# completo:
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 que não tenham instruções de nível superior.
Nenhum outro ponto de entrada
Podes escrever explicitamente um Main método, mas não pode funcionar como 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
Para o ficheiro único que contém instruções de topo, using as diretivas devem vir primeiro nesse ficheiro, como neste exemplo:
using System.Text;
StringBuilder builder = new();
builder.AppendLine("The following arguments are passed:");
foreach (var arg in args)
{
builder.AppendLine($"Argument={arg}");
}
Console.WriteLine(builder.ToString());
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 tipos
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
Use await para chamar um método assíncrono. 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 a aplicação terminar, use a instrução return como faria num método Main que devolve um int. 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 declarações de nível superior contêm a palavra-chave await ou a instrução return. A tabela seguinte mostra como é a assinatura do método, usando o nome Main do método na tabela para maior 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) |
A partir de C# 14, os programas podem ser aplicações baseadas em ficheiros, onde um único ficheiro contém o programa. Executa aplicações baseadas em ficheiros usando o comando dotnet <file.cs>, ou usando a #!/usr/bin/env dotnet diretiva como primeira linha (apenas shells Unix).
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#.