Demander des données à l'utilisateur - Spectre Console Series
Les applications de console C# ont toujours été le moyen le plus simple d'apprendre comment un programme lit les entrées de l'utilisateur et affiche la sortie. Dans sa série Spectre.Console, Tim Corey montre comment aller bien au-delà de la simple invite de commande en noir et blanc. Dans cet article, nous examinerons de près sa vidéo "Requesting Data from the User - Spectre Console Series" pour voir comment il collecte les données, traite les valeurs numériques, vérifie les erreurs et donne à son programme une apparence plus conviviale, le tout sans modifier manuellement le code standard. Des repères temporels sont inclus pour vous permettre de sauter au bon endroit dans la vidéo.
Introduction : La saisie en ligne de commande simplifiée
Dès le début, Tim nous rappelle que Spectre.Console peut transformer une entrée de ligne de commande C# ordinaire en quelque chose de visuellement attrayant. Au lieu d'écrire une méthode statique void Main(string[] args) puis de lire manuellement le flux d'entrée standard avec Console.ReadLine(), de l'analyser et de traiter les exceptions, Spectre.Console s'en charge pour vous.
Pour reprendre les termes de Tim (0:17), cette session montrera comment "demander des informations à l'utilisateur, valider les données et les convertir dans le type de données approprié" - une compétence essentielle pour tout développeur travaillant avec une console ou une invite de commande.
Lecture de valeurs entières avec Ask
Le premier exemple donné par Tim (0:35) est familier : il s'agit de demander à l'utilisateur son âge. Traditionnellement, en C#, vous écririez :
static void Main(string[] args)
{
Console.Write("Enter integer age: ");
string input = Console.ReadLine();
int age = int.Parse(input);
}
static void Main(string[] args)
{
Console.Write("Enter integer age: ");
string input = Console.ReadLine();
int age = int.Parse(input);
}
Ceci montre le point d'entrée classique d'un programme C#, la fonction principale, et la façon dont on reçoit un paramètre d'entrée du clavier par l'intermédiaire de la console. Vous devez également utiliser int.Parse ou Convert.ToInt32 pour convertir la chaîne saisie en un âge int. Tim souligne que vous devez gérer les entrées non valides et lancer ou attraper les exceptions vous-même.
Avec Spectre.Console, il écrit simplement :
int age = AnsiConsole.Ask<int>("What is your age?");
int age = AnsiConsole.Ask<int>("What is your age?");
Cette ligne lit les données d'entrée, les convertit en valeur entière et affiche un message d'erreur rouge si l'utilisateur tape des caractères non numériques - aucun code de contrôle d'erreur supplémentaire n'est nécessaire. Lorsque l'utilisateur appuie sur Entrée, la méthode lit l'entrée, l'analyse en un type numérique et la stocke dans la variable âge.
Saisie booléenne et pourquoi Prompt est meilleur
Suivant (1:14) Tim montre comment demander un booléen :
bool isHappy = AnsiConsole.Ask<bool>("Are you happy?");
bool isHappy = AnsiConsole.Ask<bool>("Are you happy?");
Si l'utilisateur saisit "true" ou "false", cela fonctionne. Mais s'ils tapent "oui", Spectre.Console affiche une erreur en rouge. Cela montre que si Ask

C'est ici que Tim passe à une API plus souple - Prompt - qui se comporte davantage comme une mini classe que vous pouvez personnaliser.
Utilisation de TextPrompt pour les choix
À 3:02, Tim passe de Ask à Prompt avec un TextPrompt
var happyText = AnsiConsole.Prompt(
new TextPrompt<string>("Are you happy?")
.AddChoice("Yes")
.AddChoice("No"));
var happyText = AnsiConsole.Prompt(
new TextPrompt<string>("Are you happy?")
.AddChoice("Yes")
.AddChoice("No"));
Lorsque le programme s'exécute (4:48), la console affiche [Yes/No] après la question. Voici Spectre.Console décorant la ligne de commande afin que l'utilisateur puisse facilement voir les réponses acceptables. Si vous tapez autre chose, la méthode le reçoit, le compare à la liste et affiche un message amical vous invitant à sélectionner une option disponible.

Ajouter une valeur par défaut
Tim ajoute ensuite un défaut (5:16) :
.DefaultValue("Yes")
.DefaultValue("Yes")
Désormais, lorsque le programme s'exécute, l'utilisateur n'a plus qu'à appuyer sur Entrée - un retour chariot sans texte - et la méthode attribue automatiquement "Oui" à la variable. C'est idéal lorsque vous souhaitez stocker une valeur par défaut raisonnable sans code supplémentaire dans votre méthode principale.
Promouvoir les nombres entiers avec validation
À 6:01, Tim montre un exemple plus riche avec une entrée entière. Il utilise un nouveau TextPrompt pour demander à nouveau l'âge, mais ajoute une logique de validation à l'intérieur même de l'invite :
int age = AnsiConsole.Prompt(
new TextPrompt<int>("What is your age?")
.Validate(x =>
{
return x switch
{
< 0 => ValidationResult.Error("[red]You were not born yet[/]"),
> 120 => ValidationResult.Error("[red]You are too old[/]"),
_ => ValidationResult.Success(),
};
}));
int age = AnsiConsole.Prompt(
new TextPrompt<int>("What is your age?")
.Validate(x =>
{
return x switch
{
< 0 => ValidationResult.Error("[red]You were not born yet[/]"),
> 120 => ValidationResult.Error("[red]You are too old[/]"),
_ => ValidationResult.Success(),
};
}));
Ici, l'invite ne se contente pas de convertir les valeurs de chaîne du flux d'entrée standard en un type numérique, elle effectue également un contrôle d'erreur basé sur des règles commerciales, par exemple en n'autorisant pas les âges négatifs. Tim le teste en direct (8:31) : la saisie de -1 déclenche "Vous n'êtes pas encore né" La saisie de 150 déclenche "Vous êtes trop vieux" Seules les entrées valides permettent au programme de passer à la ligne suivante.

Cette validation intégrée supprime la nécessité d'écrire manuellement des instructions if dans votre fonction principale, d'appeler des méthodes d'analyse et de gérer les exceptions.
Demande ou invitation : Quand utiliser l'un ou l'autre
À 9:00, Tim résume :
-
Ask : Rapide et simple. Parfait lorsque votre programme a juste besoin de lire un paramètre d'entrée et de le convertir en un type connu.
- Invite : Plus puissant. Permet d'ajouter des choix, des valeurs par défaut et des validations. Idéal pour créer une application console plus riche ou pour intégrer d'autres programmes qui appellent votre fichier exécutable à l'aide d'arguments de ligne de commande.
Les deux approches s'intègrent parfaitement à votre point d'entrée static void Main(string[] args) ou même public static void Main(string[] args). Vous pouvez également accéder à args pour lire les arguments de ligne de commande transmis lors de l'exécution du programme, les combiner avec les invites de Spectre.Console et produire une chaîne soigneusement formatée à l'aide de string.Format ou de l'interpolation.
Pourquoi c'est important pour les développeurs de consoles
Tim conclut (9:19) en soulignant que cette approche "porte votre capacité à demander l'avis de l'utilisateur à un niveau supérieur" Avec Spectre.Console, vous n'écrivez plus de code répétitif pour lire les données saisies au clavier, les convertir avec la classe Convert et afficher des messages par défaut. Au lieu de cela, vous obtiendrez :
-
Une sortie riche en couleurs à l'invite de commande.
-
Analyse automatique des types numériques, des valeurs doubles ou des valeurs de chaîne.
-
Gestion conviviale des erreurs en cas de saisie non valide.
- La possibilité de combiner des invites avec des arguments de ligne de commande traditionnels pour des modèles d'entrée hybrides.
Il est ainsi plus facile d'enseigner aux débutants la méthode principale, les types de données et les paramètres d'entrée tout en continuant à écrire des applications de console de qualité professionnelle dans Visual Studio ou tout autre éditeur.
Conclusion
En suivant les instructions de Tim Corey dans la vidéo, vous apprendrez :
-
Comment utiliser Ask de Spectre.Console pour lire et convertir les entrées utilisateur.
-
Comment utiliser TextPrompt pour présenter des choix, des valeurs par défaut et des validations.
-
Comment ces invites s'intègrent naturellement dans votre point d'entrée Main(string[\r] args) aux côtés des arguments de la ligne de commande.
- Comment réduire la vérification des erreurs de type "boilerplate" et rendre vos applications en ligne de commande plus conviviales.
Tout ce que Tim montre se compile encore en un seul fichier exécutable que vous pouvez exécuter à partir de l'invite de commande, auquel vous pouvez passer des arguments ou que vous pouvez intégrer dans des applications ou des outils Windows Forms plus importants. Il s'agit d'une façon moderne de gérer les entrées de l'utilisateur tout en conservant la simplicité de la console C# et de sa fonction principale familière.
