Instructions de niveau supérieur – programmes sans méthodes Main

Vous n’avez pas besoin d’inclure explicitement une méthode Main dans un projet d’application console. Au lieu de cela, vous pouvez utiliser la fonctionnalité d’instructions de niveau supérieur pour réduire le volume de code que vous devez écrire.

Les instructions de niveau supérieur vous permettent d’écrire du code exécutable directement à la racine d’un fichier, éliminant ainsi le besoin d’inclure votre code dans une classe ou une méthode wrapper. Cela signifie que vous pouvez créer des programmes sans la cérémonie associée à une classe Program et à une méthode Main. Dans ce cas, le compilateur génère une classe Program avec une méthode de point d’entrée pour l’application. Le nom de la méthode générée n’est pas Main, il s’agit d’un détail d’implémentation que votre code ne peut pas référencer directement.

Voici un fichier Program.cs qui est un programme C# complet en C# 10 :

Console.WriteLine("Hello World!");

Les instructions de niveau supérieur vous permettent d’écrire des programmes simples pour de petits utilitaires tels qu’Azure Functions et GitHub Actions. Elles simplifient également l’apprentissage et l’écriture du code pour les nouveaux programmeurs C#.

Les sections suivantes expliquent les règles concernant ce que vous pouvez et ne pouvez pas faire avec les instructions de niveau supérieur.

Un seul fichier de niveau supérieur

Une application doit avoir un seul point d’entrée. Un projet ne peut avoir qu’un fichier avec des instructions de niveau supérieur. Le fait de placer des instructions de niveau supérieur dans plusieurs fichiers d’un projet entraîne l’erreur du compilateur suivante :

CS8802 Une seule unité de compilation peut avoir des instructions de niveau supérieur.

Un projet peut comporter un nombre quelconque de fichiers de code source supplémentaires qui ne possèdent pas de déclarations de niveau supérieur.

Aucun autre point d’entrée

Vous pouvez écrire une méthode Main explicitement, mais elle ne peut pas fonctionner comme point d’entrée. Le compilateur émet l’avertissement suivant :

CS7022 Le point d’entrée du programme est le code global, en ignorant le point d’entrée « Main() ».

Dans un projet comportant des instructions de niveau supérieur, vous ne pouvez pas utiliser l’option de compilateur -main pour sélectionner le point d’entrée, même si le projet comporte une ou plusieurs méthodes Main.

Directives using

Si vous incluez des directives using, elles doivent figurer en premier dans le fichier, comme dans cet exemple :

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;

Espace de noms global

Les instructions de niveau supérieur figurent implicitement dans l’espace de noms global.

Espaces de noms et définitions de type

Un fichier avec des instructions de niveau supérieur peut également contenir des espaces de noms et des définitions de type, mais, dans ce cas, ceux-ci doivent figurer après les instructions de niveau supérieur. Par exemple :

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

Les instructions de niveau supérieur peuvent référencer la variable args afin d’accéder à tous les arguments de ligne de commande entrés. La variable args n’est jamais null, mais son argument Length est égal à zéro si aucun argument de ligne de commande n’a été fourni. Par exemple :

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

await

Vous pouvez appeler une méthode asynchrone à l’aide de await. Par exemple :

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

Code de sortie du processus

Pour retourner une valeur int lorsque l’application s’achève, utilisez l’instruction return comme vous le feriez dans une méthode Main qui retourne un int. Par exemple :

string? s = Console.ReadLine();

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

Méthode de point d’entrée implicite

Le compilateur génère une méthode pour servir de point d’entrée de programme pour un projet comportant des instructions de niveau supérieur. La signature de la méthode varie selon que les instructions de niveau supérieur contiennent le mot clé await ou l’instruction return. Le tableau suivant montre à quoi ressemblerait la signature de méthode, en utilisant le nom Main de la méthode dans la table pour des raisons pratiques.

Le code de niveau supérieur contient Signature implicite Main
await et return static async Task<int> Main(string[] args)
await static async Task Main(string[] args)
return static int Main(string[] args)
Aucun await ou return static void Main(string[] args)

spécification du langage C#

Pour plus d'informations, voir la spécification du langage C#. La spécification du langage est la source de référence pour la syntaxe C# et son utilisation.

Spécification des fonctionnalités – Instructions de niveau supérieur