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

À compter de C# 9, vous n’avez pas besoin d’inclure explicitement une Main méthode 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 code que vous devez écrire. Dans ce cas, le compilateur génère un point d’entrée de classe et Main de méthode pour l’application.

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 que Azure Functions et GitHub Actions. Ils simplifient également l’apprentissage et l’écriture de code pour les nouveaux programmeurs C#.

Les sections suivantes expliquent les règles sur 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 ne doit avoir qu’un seul point d’entrée. Un projet ne peut avoir qu’un seul fichier avec des instructions de niveau supérieur. Le fait de placer des instructions de niveau supérieur dans plusieurs fichiers dans 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 avoir un nombre quelconque de fichiers de code source supplémentaires qui n’ont pas d’instructions de niveau supérieur.

Aucun autre point d’entrée

Vous pouvez écrire une Main méthode 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 avec des instructions de niveau supérieur, vous ne pouvez pas utiliser l’option du compilateur -main pour sélectionner le point d’entrée, même si le projet comporte une ou plusieurs Main méthodes.

using Directives

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("Hello");
builder.AppendLine("World!");

Console.WriteLine(builder.ToString());

Espace de noms global

Les instructions de niveau supérieur sont 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 ils doivent venir 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 args variable pour accéder aux arguments de ligne de commande entrés. La args variable n’est jamais null, mais sa Length valeur est égale à 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 pour le processus

Pour retourner une int valeur à la fin de l’application, utilisez l’instruction comme vous le return feriez dans une Main méthode 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 avec des instructions de niveau supérieur. Le nom de cette méthode n’est pas , Mainil s’agit d’un détail d’implémentation que votre code ne peut pas référencer directement. La signature de la méthode varie selon que les instructions de niveau supérieur contiennent le await mot clé 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 plus de commodité.

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)
Non 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 de fonctionnalité - Instructions de niveau supérieur