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 , Main
il 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