Earn More by Sharing What You Love
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!

Tim Corey
10m 10s
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.
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.
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);
}Sub Main(ByVal args As String())
Console.Write("Enter integer age: ")
Dim input As String = Console.ReadLine()
Dim age As Integer = Integer.Parse(input)
End SubTo 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?");Dim age As Integer = AnsiConsole.Ask(Of Integer)("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.
Następnie (1:14) Tim demonstruje, jak zapytać o wartość typu Boolean:
bool isHappy = AnsiConsole.Ask<bool>("Are you happy?");Dim isHappy As Boolean = AnsiConsole.Ask(Of Boolean)("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<bool> obsługuje typy danych automatycznie, nie zawsze jest to najbardziej naturalne dla danych wejściowych użytkownika.

W tym miejscu Tim przechodzi do bardziej elastycznego API — Prompt — które działa bardziej jak mini klasa, którą można dostosować.
O godzinie 3:02 Tim przechodzi z Ask do Prompt z TextPrompt<string>. Zamiast wbudowanego Booleana, tworzy nową instancję tekstowego promptu, która daje użytkownikowi rzeczywiste wybory:
var happyText = AnsiConsole.Prompt(
new TextPrompt<string>("Are you happy?")
.AddChoice("Yes")
.AddChoice("No"));Dim happyText = AnsiConsole.Prompt(
New TextPrompt(Of 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ępną opcję.

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.
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(),
};
}));Dim age As Integer = AnsiConsole.Prompt(
New TextPrompt(Of Integer)("What is your age?").Validate(Function(x)
Select Case x
Case Is < 0
Return ValidationResult.Error("[red]You were not born yet[/]")
Case Is > 120
Return ValidationResult.Error("[red]You are too old[/]")
Case Else
Return ValidationResult.Success()
End Select
End Function))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.
O godzinie 9:00 Tim podsumowuje:
Ask: Szybki i prosty. 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.
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.
Śledząc wytyczne Tima Coreya w wideo, uczysz się:
Jak używać Spectre.Console's Ask do odczytywania i konwersji danych wejściowych użytkownika.
Jak używać TextPrompt do prezentacji wyborów, domyślnych wartości 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.
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!
Join our newsletter, you’ll get exclusive access on article updates. We value your privacy