Menu

Hello World en C# : Main, Console.WriteLine et ReadLine

Votre premier programme C# ligne par ligne : la méthode Main, Console.WriteLine et Write, la lecture d'une saisie avec Console.ReadLine, les commentaires, la création et l'exécution d'un projet avec la CLI dotnet, et les instructions de niveau supérieur.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

Le premier programme classique affiche une ligne de texte. En C#, il ressemble à ceci :

Sortie :

Hello, World!

Ligne par ligne

  • using System; vous permet d'écrire Console au lieu du nom complet System.Console. Console est une classe du namespace System (voir namespaces et using).
  • class Program déclare une classe. Tout le code C# vit dans un type ; le nom Program est une convention, pas une obligation.
  • static void Main() est le point d'entrée. Au démarrage du programme, le runtime cherche une méthode statique nommée Main et l'appelle. static signifie qu'elle appartient à la classe elle-même, donc aucun objet n'a besoin d'être créé au préalable. void signifie qu'elle ne renvoie rien.
  • Console.WriteLine("Hello, World!"); appelle la méthode WriteLine avec une chaîne en argument. Chaque instruction se termine par un point-virgule.
  • Les accolades { } délimitent le corps de la classe et celui de la méthode.

C# est sensible à la casse. console.writeline et main sont des noms différents de Console.WriteLine et Main, et aucun des deux n'existe.

Console.WriteLine ou Console.Write

WriteLine ajoute un retour à la ligne après le texte. Write ne le fait pas, donc la sortie suivante continue sur la même ligne. Les deux acceptent n'importe quel type, pas seulement des chaînes : les nombres, les booléens et les objets sont convertis avec leur méthode ToString().

Sortie :

Loading.. done
42
True

Item: coffee
coffee costs 3.20
coffee costs 3.20

Remarquez que true s'affiche True : c'est ce que renvoie bool.ToString(). La forme $"...", appelée interpolation de chaînes, est celle que vous utiliserez le plus ; voir interpolation de chaînes pour les codes de format comme :F2.

Lire une saisie avec Console.ReadLine

Console.ReadLine() attend que l'utilisateur tape une ligne et appuie sur Entrée, puis renvoie cette ligne sous forme de string sans le retour à la ligne. À la fin de l'entrée (par exemple quand l'entrée est redirigée depuis un fichier entièrement lu), elle renvoie null.

Sortie :

What is your name? How old are you? 
Hi Maya, next year you will be 28.

Quand vous l'exécutez dans un terminal, le texte que vous tapez apparaît après chaque invite. La sortie ci-dessus ne contient aucun texte tapé, car l'entrée a été redirigée (envoyée par un pipe) au lieu d'être saisie ; seul ce que le programme écrit lui-même apparaît.

ReadLine renvoie toujours du texte. Pour utiliser la valeur comme un nombre, il faut la convertir. int.Parse(text) lève une FormatException quand le texte n'est pas un nombre ; int.TryParse renvoie false à la place, c'est pourquoi c'est le bon choix pour une saisie utilisateur. Les détails sont dans conversion de types.

Deux méthodes voisines : Console.Read() renvoie le caractère suivant sous forme de code int, et Console.ReadKey() lit une seule touche sans attendre Entrée (elle ne fonctionne que dans un terminal interactif).

Les autres formes de la méthode Main

Main peut recevoir les arguments de la ligne de commande et renvoyer un code de sortie. Ce sont tous des points d'entrée valides :

static void Main()
static void Main(string[] args)
static int Main()
static int Main(string[] args)
static async Task Main()             // C# 7.1 and later
static async Task<int> Main(string[] args)  // C# 7.1 and later

Un int renvoyé devient le code de sortie du processus, que les scripts et les systèmes de CI lisent pour savoir si le programme a réussi (0 signifie succès par convention).

Sortie :

Got 0 argument(s)

Lancez-le avec dotnet run -- apples pears et args contient "apples" et "pears". Le -- sépare les arguments destinés à votre programme de ceux destinés à l'outil dotnet.

Les commentaires

C# a trois sortes de commentaires. Le compilateur les ignore tous.

// A single-line comment runs to the end of the line.

/* A block comment
   can span several lines. */

/// <summary>
/// An XML documentation comment. Editors show it as the tooltip for the method.
/// </summary>
static decimal ApplyDiscount(decimal price) => price * 0.9m;

Utilisez // pour les notes dans le code. Les commentaires /// se placent sur les types et les membres publics ; l'IDE les affiche quand vous survolez un appel, et le compilateur peut les exporter dans un fichier XML pour les outils de documentation.

Créer et exécuter un projet avec dotnet

Sur votre propre machine, installez le SDK .NET depuis dotnet.microsoft.com, puis :

dotnet new console -o HelloApp
cd HelloApp
dotnet run
Hello, World!

dotnet new console crée deux fichiers : HelloApp.csproj (le fichier projet : framework cible, paramètres, références de packages) et Program.cs. dotnet run compile le projet et l'exécute. dotnet build compile sans exécuter et écrit le résultat dans bin/Debug/net8.0/ (le nom du dossier suit votre framework cible).

Les instructions de niveau supérieur (C# 9 et plus)

Ouvrez le Program.cs généré et vous trouverez ceci, et rien d'autre :

// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

C'est un programme à instructions de niveau supérieur (top-level statements), une fonctionnalité de C# 9. Le compilateur génère la classe Program et la méthode Main autour de vos instructions. using System; est aussi absent, car les projets .NET 6 et plus activent les usings implicites : des namespaces courants comme System, System.IO, System.Linq et System.Collections.Generic sont importés pour tout le projet.

Les programmes de niveau supérieur peuvent quand même lire args, utiliser await et renvoyer un code de sortie avec return :

// C# 9 and later: the whole Program.cs
Console.Write("Name: ");
string? name = Console.ReadLine();
Console.WriteLine($"Hello, {name}! You passed {args.Length} arguments.");
return 0;

Un seul fichier par projet peut contenir des instructions de niveau supérieur, et les types (classes, records) doivent venir après elles. L'annotation string? est un type référence nullable (C# 8), présent parce que ReadLine peut renvoyer null. La forme explicite class Program utilisée dans les exemples de cette page est équivalente ; c'est celle que vous verrez dans le code plus ancien et dans la plupart des scripts Unity, il vaut donc la peine de savoir lire les deux. Passez --use-program-main à dotnet new console si vous préférez la forme explicite dans les nouveaux projets.

Les premières erreurs que vous verrez

  • CS1002: ; expected. Il manque le point-virgule d'une instruction. L'erreur est signalée à la fin de la ligne où il manque.
  • CS0103: The name 'console' does not exist in the current context. Mauvaise casse, ou using System; absent dans un projet sans usings implicites.
  • CS5001: Program does not contain a static 'Main' method suitable for an entry point. Main est mal orthographié, n'est pas static ou a une signature non prise en charge.
  • CS0017: Program has more than one entry point defined. Deux classes ont chacune un Main. Gardez-en un, ou choisissez-en un avec le paramètre StartupObject dans le .csproj.
  • La fenêtre se ferme immédiatement. Quand une application console est lancée par un double-clic, la fenêtre se ferme au retour de Main. Exécutez-la depuis un terminal, ou ajoutez Console.ReadKey(); à la fin pendant vos tests.

Questions fréquentes

Comment écrire Hello World en C# ?

Placez Console.WriteLine("Hello, World!"); dans une méthode static void Main() d'une classe, avec using System; en haut du fichier. Dans un projet créé par dotnet new console sous .NET 6 ou plus, le fichier entier peut se réduire à cette seule ligne, car les instructions de niveau supérieur génèrent la classe et Main pour vous.

Qu'est-ce que la méthode Main en C# ?

Main est le point d'entrée : la méthode que le runtime appelle au démarrage du programme. Elle doit être static, peut renvoyer void ou int (le code de sortie) et peut prendre un paramètre string[] args contenant les arguments de la ligne de commande. Un programme en a exactement une.

Quelle est la différence entre Console.Write et Console.WriteLine ?

Console.WriteLine écrit le texte suivi d'un retour à la ligne, donc la sortie suivante commence sur une nouvelle ligne. Console.Write écrit seulement le texte, donc la sortie suivante continue sur la même ligne. Console.WriteLine() sans argument affiche une ligne vide.

Comment lire une saisie de l'utilisateur en C# ?

Console.ReadLine() lit une ligne de texte et la renvoie sous forme de string (sans le retour à la ligne), ou null quand il n'y a plus d'entrée. Pour obtenir un nombre, convertissez la chaîne : int.TryParse(Console.ReadLine(), out int n) renvoie false au lieu de planter quand le texte n'est pas un nombre.

Comment exécuter un programme C# en ligne de commande ?

Installez le SDK .NET, puis lancez dotnet new console -o HelloApp pour créer un projet, cd HelloApp, et dotnet run pour le compiler et l'exécuter. dotnet build se contente de compiler et place le résultat dans bin/Debug/net8.0/ (ou la version que vous ciblez).

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER