Abfrage von Daten beim Benutzer - Spectre Console Series
C#-Konsolenanwendungen waren schon immer der einfachste Weg, um zu lernen, wie ein Programm Eingaben des Benutzers liest und Ausgaben anzeigt. In seiner Spectre.Console-Serie zeigt Tim Corey, wie man weit über die einfache schwarz-weiße Eingabeaufforderung hinausgeht. In diesem Artikel sehen wir uns sein Video "Daten vom Benutzer abfragen - Spectre Console Series" genauer an, um zu sehen, wie er Eingaben erfasst, numerische Werte verarbeitet, Fehlerprüfungen durchführt und seinem Programm ein freundlicheres Aussehen verleiht - und das alles ohne manuelle Änderung von Boilerplate-Code. Es sind Zeitstempel enthalten, damit Sie an die richtige Stelle im Video springen können.
Einführung: Befehlszeileneingabe leicht gemacht
Gleich zu Beginn erinnert uns Tim daran, dass Spectre.Console gewöhnliche C-Befehlszeileneingaben in etwas visuell Ansprechendes verwandeln kann. Anstatt eine vollständige statische void-Methode Main(string[] args) zu schreiben und dann manuell mit Console.ReadLine() aus dem Standardeingabestrom zu lesen, ihn zu analysieren und mit Ausnahmen umzugehen, übernimmt Spectre.Console diese Aufgaben für Sie.
In Tims Worten (0:17) wird in dieser Sitzung gezeigt, wie man "den Benutzer um Eingaben bittet, die Daten validiert und sie in den entsprechenden Datentyp umwandelt" - eine Kernkompetenz für jeden Entwickler, der mit einer Konsole oder Eingabeaufforderung arbeitet.
Lesen von Ganzzahlen mit Ask
Tims erstes Beispiel (0:35) ist ein bekanntes: Er fragt den Benutzer nach seinem Alter. Traditionell würde man in C# schreiben:
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);
}
Dies zeigt den klassischen Einstiegspunkt eines C#-Programms, die Hauptfunktion, und wie Sie einen Eingabeparameter von der Tastatur über die Konsole erhalten. Sie müssen auch int.Parse oder Convert.ToInt32 verwenden, um die String-Eingabe in einen int-Wert zu konvertieren. Tim weist darauf hin, dass Sie selbst mit ungültigen Eingaben umgehen und Ausnahmen werfen oder abfangen müssen.
Bei Spectre.Console schreibt er einfach:
int age = AnsiConsole.Ask<int>("What is your age?");
int age = AnsiConsole.Ask<int>("What is your age?");
Diese eine Zeile liest Eingaben, konvertiert sie in einen Integer-Wert und zeigt eine rote Fehlermeldung an, wenn der Benutzer nicht-numerische Zeichen eingibt - es ist kein zusätzlicher Fehlerprüfungscode erforderlich. Wenn der Benutzer die Eingabetaste drückt, liest die Methode die Eingabe, parst sie in einen numerischen Typ und speichert sie in der Variablen age.
Boolesche Eingabe und warum Prompt besser ist
Weiter (1:14) Tim demonstriert, wie man nach einem Booleschen Wert fragt:
bool isHappy = AnsiConsole.Ask<bool>("Are you happy?");
bool isHappy = AnsiConsole.Ask<bool>("Are you happy?");
Wenn der Benutzer "wahr" oder "falsch" eingibt, funktioniert es. Wenn sie jedoch "ja" eingeben, zeigt Spectre.Console einen roten Fehler an. Dies zeigt, dass Ask

An dieser Stelle wechselt Tim zu einer flexibleren API - Prompt - die sich eher wie eine Miniklasse verhält, die Sie anpassen können.
Verwendung von TextPrompt für Auswahlen
Bei 3:02 wechselt Tim von Ask zu Prompt mit einem 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"));
Wenn das Programm ausgeführt wird (4:48), zeigt die Konsole nach der Frage [Ja/Nein] an. Dies ist Spectre.Console, das die Befehlszeile dekoriert, so dass der Benutzer die akzeptablen Antworten leicht erkennen kann. Wenn Sie etwas anderes eingeben, wird es von der Methode empfangen, mit der Liste abgeglichen und eine freundliche Meldung angezeigt, die Sie auffordert, eine verfügbare Option auszuwählen.

Hinzufügen eines Standardwertes
Tim fügt dann einen Standard hinzu (5:16):
.DefaultValue("Yes")
.DefaultValue("Yes")
Wenn das Programm nun ausgeführt wird, kann der Benutzer einfach die Eingabetaste drücken - ein Zeilenumbruch ohne Text - und die Methode weist der Variablen automatisch "Ja" zu. Dies ist ideal, wenn Sie eine vernünftige Vorgabe ohne zusätzlichen Code in Ihrer Hauptmethode speichern möchten.
Aufforderung zur Eingabe ganzer Zahlen mit Validierung
Bei 6:01 zeigt Tim ein umfangreicheres Beispiel mit Integer-Eingabe. Er verwendet einen neuen TextPrompt, um erneut nach dem Alter zu fragen, fügt aber eine Validierungslogik direkt in den Prompt ein:
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(),
};
}));
In diesem Fall konvertiert die Eingabeaufforderung nicht nur die Zeichenkettenwerte aus dem Standardeingabestrom in einen numerischen Typ, sondern führt auch eine Fehlerprüfung auf der Grundlage von Geschäftsregeln durch, z. B. dass keine negativen Altersangaben zulässig sind. Tim testet es live (8:31): Die Eingabe von -1 löst "You were not born yet" aus Die Eingabe von 150 löst "Du bist zu alt" aus Nur gültige Eingaben lassen das Programm mit der nächsten Zeile fortfahren.

Diese integrierte Validierung macht es überflüssig, manuell if-Anweisungen in Ihre Hauptfunktion zu schreiben, Parse-Methoden aufzurufen und Ausnahmen zu behandeln.
Abfrage vs. Aufforderung: Wann sollte man sie verwenden
Um 9:00 Uhr fasst Tim zusammen:
-
Ask: Schnell und einfach. Perfekt, wenn Ihr Programm nur einen Eingabeparameter lesen und in einen bekannten Typ konvertieren muss.
- Aufforderung: Mächtiger. Ermöglicht das Hinzufügen von Auswahlmöglichkeiten, Standardwerten und Validierungen. Ideal, wenn Sie eine umfangreichere Konsolenanwendung erstellen oder mit anderen Programmen integrieren möchten, die Ihre ausführbare Datei mit Befehlszeilenargumenten aufrufen.
Beide Ansätze passen immer noch gut in Ihren statischen void Main(string[] args) oder sogar öffentlichen statischen void Main(string[] args) Einstiegspunkt. Sie können auch auf args zugreifen, um Befehlszeilenargumente zu lesen, die bei der Programmausführung übergeben werden, dies mit Spectre.Console-Eingabeaufforderungen kombinieren und eine sauber formatierte Zeichenfolge mit string.Format oder Interpolation ausgeben.
Warum es für Konsolenentwickler wichtig ist
Tim schließt (9:19) mit der Bemerkung, dass dieser Ansatz "Ihre Fähigkeit, den Benutzer um Eingaben zu bitten, auf die nächste Stufe hebt." Mit Spectre.Console müssen Sie keinen sich wiederholenden Code mehr schreiben, um Tastatureingaben zu lesen, sie mit der Convert-Klasse zu konvertieren und Standardmeldungen anzuzeigen. Stattdessen erhalten Sie:
-
Reichhaltige Ausgabe in Farbe an der Eingabeaufforderung.
-
Automatisches Parsen von numerischen Typen, Doppelwerten oder String-Werten.
-
Freundliche Fehlerbehandlung für ungültige Eingaben.
- Die Fähigkeit, Eingabeaufforderungen mit traditionellen Befehlszeilenargumenten für hybride Eingabemodelle zu kombinieren.
Dies macht es einfacher, Anfängern die Hauptmethode, Datentypen und Eingabeparameter beizubringen und gleichzeitig professionelle Konsolenanwendungen in Visual Studio oder einem anderen Editor zu schreiben.
Abschluss
Wenn Sie Tim Coreys Ausführungen im Video folgen, lernen Sie:
-
Wie verwendet man Ask von Spectre.Console, um Benutzereingaben zu lesen und zu konvertieren.
-
Wie man TextPrompt nutzt, um Auswahlmöglichkeiten, Standardwerte und Validierung zu präsentieren.
-
Wie diese Eingabeaufforderungen neben den Befehlszeilenargumenten auf natürliche Weise in Ihren Main(string[] args)-Einstiegspunkt passen.
- Wie Sie die Fehlerprüfung von Boilerplates reduzieren und Ihre Kommandozeilenanwendungen freundlicher gestalten können.
Alles, was Tim zeigt, lässt sich in eine einzige ausführbare Datei kompilieren, die Sie über die Eingabeaufforderung ausführen, mit Argumenten versehen oder in größere Windows Forms-Anwendungen oder -Tools einbetten können. Es handelt sich um eine moderne Art, Benutzereingaben zu verarbeiten, wobei die Einfachheit der C#-Konsole und ihrer vertrauten Hauptfunktion erhalten bleibt.
