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 intégrez des directives using
, celles-ci doivent figurer en premier dans le fichier, comme dans l’exemple suivant :
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