Apprenez à lire une valeur avec Console.ReadLine, à la convertir avec TryParse et à valider proprement chaque entrée dans votre application console C#.

Saisie utilisateur en C# : mieux utiliser TryParse
Une application devient interactive lorsqu’elle reçoit des données. Dans une application console, Console.ReadLine() permet de lire ce que l’utilisateur saisit. Mais cette entrée reste du texte : il faut la convertir et surtout la valider avant de l’utiliser.
Lire une chaîne
Console.Write("Entrez votre prénom : ");
string prenom = Console.ReadLine() ?? string.Empty;
Console.ReadLine() retourne une string?, car la fin du flux peut produire null. L’opérateur ?? fournit ici une chaîne vide par défaut.
Vérifiez ensuite que le texte contient une vraie valeur :
if (string.IsNullOrWhiteSpace(prenom))
{
Console.WriteLine("Le prénom est obligatoire.");
return;
}
Convertir sans provoquer d’exception
Une saisie utilisateur est une donnée non fiable. int.Parse() lève une exception si le texte n’est pas un entier. TryParse permet de traiter l’échec comme un cas normal :
Console.Write("Entrez votre âge : ");
string saisieAge = Console.ReadLine() ?? string.Empty;
if (!int.TryParse(saisieAge, out int age))
{
Console.WriteLine("L’âge doit être un nombre entier.");
return;
}
La méthode renvoie un booléen. Si elle réussit, elle place le résultat dans le paramètre out age. Pour valider un format sans conserver la valeur, écrivez out _ : voir le discard _ en C#.
Valider le format et la règle métier
Une conversion réussie ne garantit pas que la valeur soit réaliste :
if (age < 0 || age > 150)
{
Console.WriteLine("L’âge doit être compris entre 0 et 150.");
return;
}
La validation se fait donc en deux niveaux :
- le texte a-t-il le bon format ?
- la valeur respecte-t-elle les règles de l’application ?
Tenir compte du séparateur décimal
Le français utilise généralement la virgule et l’anglais le point. Vous pouvez imposer un format portable :
using System.Globalization;
bool estValide = decimal.TryParse(
Console.ReadLine(),
NumberStyles.Any,
CultureInfo.InvariantCulture,
out decimal taille);
Dans cet exemple, l’utilisateur doit saisir 1.75. Pour une application destinée uniquement à un public français, utilisez plutôt CultureInfo.GetCultureInfo("fr-FR") et acceptez 1,75.
Exemple complet
Console.Write("Prénom : ");
string prenom = Console.ReadLine() ?? string.Empty;
if (string.IsNullOrWhiteSpace(prenom))
{
Console.WriteLine("Le prénom est obligatoire.");
return;
}
Console.Write("Âge : ");
if (!int.TryParse(Console.ReadLine(), out int age) || age is < 0 or > 150)
{
Console.WriteLine("Âge invalide.");
return;
}
string categorie = age switch
{
< 12 => "Enfant",
< 18 => "Adolescent",
< 65 => "Adulte",
_ => "Senior"
};
Console.WriteLine($"Bonjour {prenom}, catégorie : {categorie}.");
Redemander tant que la saisie est invalide
Quitter le programme à la première erreur est brutal. Une boucle permet de redemander la valeur, avec une limite de tentatives pour ne jamais boucler indéfiniment (par exemple si l’entrée standard est redirigée depuis un fichier vide) :
static int? LireAge(int tentativesMax = 3)
{
for (int essai = 1; essai <= tentativesMax; essai++)
{
Console.Write("Âge : ");
string? saisie = Console.ReadLine();
if (saisie is null)
{
return null; // fin du flux d’entrée
}
if (int.TryParse(saisie, out int age) && age is >= 0 and <= 150)
{
return age;
}
Console.WriteLine("Âge invalide, entrez un entier entre 0 et 150.");
}
return null;
}
Le type de retour int? distingue clairement « aucune valeur valide » d’un âge égal à 0. Les boucles sont détaillées dans l’épisode consacré à for, while et foreach.
Parse, TryParse ou Convert ?
| Méthode | Entrée invalide | Entrée null | Usage conseillé |
|---|---|---|---|
int.Parse | lève FormatException | lève ArgumentNullException | donnée déjà garantie valide |
Convert.ToInt32 | lève FormatException | retourne 0 | rarement utile pour une saisie |
int.TryParse | retourne false | retourne false | toute donnée externe |
Le comportement de Convert.ToInt32(null) est piégeux : un champ absent devient silencieusement 0. Pour une saisie utilisateur, un fichier ou une requête HTTP, TryParse reste le bon réflexe. Dans une API ASP.NET Core, la même validation en deux niveaux est industrialisée par FluentValidation.
Exercice : convertisseur de températures
Demandez une température en degrés Celsius (avec virgule décimale française), refusez les valeurs inférieures au zéro absolu (−273,15 °C), puis affichez la conversion en Fahrenheit avec une décimale.
Voir une solution
using System.Globalization;
var fr = CultureInfo.GetCultureInfo("fr-FR");
Console.Write("Température en °C : ");
if (!decimal.TryParse(Console.ReadLine(), NumberStyles.Number, fr, out decimal celsius))
{
Console.WriteLine("Saisissez un nombre, par exemple 21,5.");
return;
}
if (celsius < -273.15m)
{
Console.WriteLine("Une température ne peut pas être inférieure au zéro absolu.");
return;
}
decimal fahrenheit = celsius * 9 / 5 + 32;
Console.WriteLine(string.Format(fr, "{0:N1} °C = {1:N1} °F", celsius, fahrenheit));
Erreurs fréquentes
- appeler
Parsedirectement sur une donnée saisie ; - ignorer le booléen retourné par
TryParse; - vérifier uniquement le format et oublier les limites métier ;
- supposer que le séparateur décimal est identique sur toutes les machines.
Épisode précédent : variables et types en C#. Épisode suivant : écrire des conditions en C#.
La série C# pour débutants
Cette série suit une progression : chaque épisode réutilise les notions des précédents.
- Variables et types
- Saisie utilisateur et TryParse (vous êtes ici)
- Conditions if, else et ternaire
- Switch et pattern matching
- Boucles for, while et foreach
- Tableaux, listes, dictionnaires et LINQ
- Méthodes, paramètres et surcharges
Une fois ces bases acquises, le parcours C# et ASP.NET Core prolonge la série vers les API web, la validation et l’asynchrone.