Żądanie danych od użytkownika - seria Spectre Console
Aplikacje konsolowe C# zawsze były najprostszym sposobem na naukę, jak program odczytuje dane wejściowe od użytkownika i wyświetla wyjście. W swojej serii Spectre.Console, Tim Corey pokazuje, jak wyjść poza zwykły czarno-biały wiersz polecenia. W tym artykułe przyjrzymy się dokładnie jego wideo "Requesting Data from the User - Spectre Console Series", aby zobaczyć, jak zbiera dane wejściowe, obsługuje wartości numeryczne, wykonuje sprawdzanie błędów i nadaje swojemu programowi przyjaźniejszy wygląd — wszystko bez ręcznej modyfikacji kodu szablonowego. Dołączone są znaczniki czasu, abyś mógł przeskoczyć do właściwego miejsca w wideo.
Wprowadzenie: Ułatwione wprowadzanie danych w wierszu polecenia
Na samym początku Tim przypomina nam, że Spectre.Console może przekształcić zwykłe wejście wiersza polecenia C w coś wizualnie atrakcyjnego. Zamiast pisać pełną metodę static void Main(string[] args), a następnie ręcznie wczytywać ze standardowego strumienia wejściowego za pomocą Console.ReadLine(), analizować go i radzić sobie z wyjątkami, Spectre.Console opakowuje to za ciebie.
Według słów Tima (0:17), ta sesja pokaże, jak "poprosić użytkownika o dane wejściowe, zweryfikować dane i przekonwertować je na odpowiedni typ danych" — kluczowa umiejętność dla każdego programisty pracującego z konsolą lub wierszem polecenia.
Odczytywanie wartości całkowitych za pomocą Ask
Pierwszy przykład Tima (0:35) jest dobrze znany: zapytaj użytkownika o jego wiek. Tradycyjnie w C# napisałbyś:
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);
}
To pokazuje klasyczny punkt wejścia programu C#, główną funkcję oraz to, jak otrzymać parametr wejściowy z klawiatury przez konsolę. Musisz także użyć int.Parse lub Convert.ToInt32, aby przekonwertować wejście w postaci stringa na int age. Tim zauważa, że musisz samodzielnie obsłużyć nieprawidłowe wejście i samodzielnie rzucać lub przechwytywać wyjątki.
Z Spectre.Console po prostu pisze:
int age = AnsiConsole.Ask<int>("What is your age?");
int age = AnsiConsole.Ask<int>("What is your age?");
To jedna linia wczytuje dane wejściowe, konwertuje je na wartość całkowitą i wyświetla czerwony komunikat o błędzie, jeśli użytkownik wpisze znaki nienumeryczne — bez konieczności dodatkowego kodu sprawdzania błędów. Gdy użytkownik naciśnie Enter, metoda czyta dane wejściowe, analizuje je na typ numeryczny i przechowuje je w zmiennej age.
Wprowadzenie typu Boolean i dłączego Prompt jest lepszy
Następnie (1:14) Tim demonstruje, jak zapytać o wartość typu Boolean:
bool isHappy = AnsiConsole.Ask<bool>("Are you happy?");
bool isHappy = AnsiConsole.Ask<bool>("Are you happy?");
Jeśli użytkownik wpisze "true" lub "false", działa. Ale jeśli wpisze "yes", Spectre.Console wyświetla czerwony błąd. To pokazuje, że chociaż Ask

W tym miejscu Tim przechodzi do bardziej elastycznego API — Prompt — które działa bardziej jak mini klasa, którą można dostosować.
Użycie TextPrompt do wyboru
O godzinie 3:02 Tim przechodzi z Ask do Prompt z 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"));
Gdy program się wykonuje (4:48), po pytaniu w konsoli pojawia się [Yes/No]. To Spectre.Console dekoruje wiersz poleceń, aby użytkownik mógł łatwo zobaczyć akceptowalne odpowiedzi. Jeśli wpiszesz cokolwiek innego, metoda to odbiera, sprawdza na liście i wyświetla przyjazny komunikat, mówiąc, aby wybrać dostępna opcja.

Dodawanie wartości domyślnej
Następnie Tim dodaje wartość domyślną (5:16):
.DefaultValue("Yes")
.DefaultValue("Yes")
Teraz, gdy program działa, użytkownik może po prostu nacisnąć Enter — powrót karetki bez tekstu — a metoda automatycznie przypisuje "Yes" do zmiennej. To świetne, gdy chcesz przechowywać rozsądną wartość domyślną bez dodatkowego kodu w głównej metodzie.
Zadawanie pytań o liczby całkowite z walidacją
O godzinie 6:01 Tim pokazuje bardziej złożony przykład z wejściem liczby całkowitej. Używa nowego TextPrompt, aby ponownie zapytać o wiek, ale dodaje logikę walidacji wewnątrz samego promptu:
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(),
};
}));
Tutaj prompt nie tylko konwertuje wartości string ze standardowego strumienia wejściowego na typ numeryczny, ale także wykonuje sprawdzanie błędów na podstawie reguł biznesowych — na przykład nie pozwalając na ujemne wieki. Tim testuje to na żywo (8:31): wpisanie -1 powoduje "Nie byłeś jeszcze urodzony." Wpisanie 150 powoduje "Jesteś za stary." Tylko prawidłowe wejście pozwala programowi przejść do następnej linii.

Ta wbudowana walidacja eliminuje potrzebę ręcznego pisania instrukcji if w swojej głównej funkcji, wywoływania metod analizy i obsługi wyjątków.
Ask vs Prompt: kiedy używać każdego z nich
O godzinie 9:00 Tim podsumowuje:
-
Ask: szybkie i proste. Idealne, gdy twój program potrzebuje tylko odczytać jeden parametr wejściowy i przekonwertować go na znany typ.
- Prompt: bardziej potężne. Pozwala dodawać wybory, wartości domyślne i walidacje. Świetne, gdy tworzysz bogatszą aplikację konsolową lub integrujesz się z innymi programami, które wywołują twój plik wykonywalny z argumentami wiersza poleceń.
Obie metody nadal pasują zgrabnie do twojego static void Main(string[] args) lub nawet public static void Main(string[] args) entry point. Możesz także uzyskać dostęp do args, aby odczytać argumenty wiersza poleceń przekazywane przy uruchomieniu programu, połączyć je z promptami Spectre.Console i uzyskać starannie sformatowaną odpowiedź za pomocą string.Format lub interpolacji.
Dłączego to jest ważne dla deweloperów konsolowych
Tim kończy (9:19) podkreślając, jak to podejście "wznosi twoją zdolność do pytania użytkownika o dane wejściowe na wyższy poziom." Z Spectre.Console nie piszesz już powtarzalnego kodu do odczytu wejścia z klawiatury, konwersji z użyciem klasy Convert i wyświetlania domyślnych komunikatów. Zamiast tego zyskujesz:
-
Bogate wyjście w kolorze na wierszu poleceń.
-
Automatyczne analizowanie typów numerycznych, wartości podwójnych lub wartości łańcucha.
-
Przyjazna obsługa błędów dla nieprawidłowego wejścia.
- Możliwość łączenia promptów z tradycyjnymi argumentami wiersza poleceń dla hybrydowych modeli wejściowych.
To ułatwia nauczanie początkujących o głównej metodzie, typach danych i parametrach wejściowych, a jednocześnie piszesz profesjonalnej klasy aplikacje konsolowe w Visual Studio lub dowolnym innym edytorze.
Wnioski
Śledząc wytyczne Tima Coreya w wideo, uczysz się:
-
Jak używać Spectre.Console's Ask do odczytu i konwersji danych wejściowych użytkownika.
-
Jak używać TextPrompt do prezentowania wyborów, wartości domyślnych i walidacji.
-
Jak te prompty naturalnie pasują do twojego Main(string[] args) entry point obok argumentów wiersza poleceń.
- Jak zredukować powtarzalne sprawdzanie błędów i uczynić twoje aplikacje wiersza poleceń bardziej przyjaznymi.
Wszystko, co pokazuje Tim, nadal kompiluje się do pojedynczego pliku wykonywalnego, który można uruchomić z wiersza poleceń, przesyłać do niego argumenty lub osadzić w większych aplikacjach Windows Forms lub narzędziach. To nowoczesny sposób obsługi danych wejściowych użytkownika, zachowując prostotę konsoli C# i jej znajomej głównej funkcji.
