Istruzioni di primo livello: programmi senza metodi Main

Non è necessario includere in modo esplicito un metodo Main in un progetto di applicazione console. È invece possibile usare la funzionalità istruzioni di primo livello per ridurre al minimo il codice da scrivere.

Le istruzioni di primo livello consentono di scrivere codice eseguibile direttamente nella radice di un file, eliminando la necessità di eseguire il wrapping del codice in una classe o in un metodo. Questo significa che è possibile creare programmi senza la procedura di una classe Program e un metodo Main. In questo caso, il compilatore genera una classe Program con un metodo punto di ingresso per l'applicazione. Il nome del metodo generato non è Main, è un dettaglio di implementazione a cui il codice non può fare riferimento direttamente.

Ecco un file Program.cs che è un programma C# completo in C# 10:

Console.WriteLine("Hello World!");

Le istruzioni di primo livello consentono di scrivere programmi semplici per utilità di piccole dimensioni, ad esempio Funzioni di Azure e GitHub Actions. Semplificano anche l'apprendimento e la scrittura di codice per i nuovi programmatori C#.

Le sezioni seguenti illustrano le regole sulle operazioni che è possibile e non è possibile eseguire con le istruzioni di primo livello.

Solo un file di primo livello

Un'applicazione deve avere un solo punto di ingresso. Un progetto può avere un solo file con istruzioni di primo livello. L'inserimento di istruzioni di primo livello in più file in un progetto genera l'errore del compilatore seguente:

CS8802 Le istruzioni di primo livello possono essere presenti solo in un'unica unità di compilazione.

Un progetto può avere un numero qualsiasi di file di codice sorgente aggiuntivi che non dispongono di istruzioni di primo livello.

Nessun altro punto di ingresso

È possibile scrivere un metodo Main in modo esplicito, ma non può funzionare come punto di ingresso. Il compilatore genera l'avviso seguente:

CS7022 Il punto di ingresso del programma è codice globale. Il punto di ingresso 'Main()' verrà ignorato.

In un progetto con istruzioni di primo livello non è possibile usare l'opzione del compilatore -main per selezionare il punto di ingresso, anche se il progetto dispone di uno o più metodi Main.

Direttiveusing

Se si includono direttive using, devono venire prima nel file, come in questo esempio:

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;

Spazio dei nomi globale

Le istruzioni di primo livello sono in modo implicito nello spazio dei nomi globale.

Spazi dei nomi e definizioni dei tipi

Un file con istruzioni di primo livello può contenere anche spazi dei nomi e definizioni dei tipi, ma devono venire dopo le istruzioni di primo livello. Ad esempio:

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

Le istruzioni di primo livello possono fare riferimento alla variabile args per accedere a qualsiasi argomento della riga di comando immesso. La variabile args non è mai null, ma il relativo Length è zero se non sono stati forniti argomenti della riga di comando. Ad esempio:

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

await

È possibile chiamare un metodo asincrono usando await. Ad esempio:

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

Codice di uscita per il processo

Per restituire un valore int al termine dell'applicazione, usare l'istruzione return come in un metodo Main che restituisce un int. Ad esempio:

string? s = Console.ReadLine();

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

Metodo del punto di ingresso implicito

Il compilatore genera un metodo da usare come punto di ingresso del programma per un progetto con istruzioni di primo livello. La firma del metodo dipende dal fatto che le istruzioni di primo livello contengano la parola chiave await o l'istruzione return. Nella tabella seguente viene illustrato l'aspetto della firma del metodo, usando il nome del metodo Main nella tabella per praticità.

Il codice di primo livello contiene Firma Main implicita
await e return static async Task<int> Main(string[] args)
await static async Task Main(string[] args)
return static int Main(string[] args)
No await o return static void Main(string[] args)

Specifiche del linguaggio C#

Per altre informazioni, vedere la specifica del linguaggio C#. La specifica del linguaggio costituisce il riferimento ufficiale principale per la sintassi e l'uso di C#.

Specifica funzionalità - Istruzioni di primo livello