Przejdź do treści stopki
Iron Academy Logo
Aplikacja C#
Aplikacja C#

Inne Kategorie

Żądanie danych od użytkownika - seria Spectre Console

[[academy-video-youtube({"vid": "fmAClT_yr84", "start_time": "0", "title": "Pobieranie danych od użytkownika - seria Spectre Console", "creator": "Tim Corey", "length": "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.

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 dlaczego 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<bool> obsługuje typy danych automatycznie, nie zawsze jest to najbardziej naturalne dla danych wejściowych użytkownika.

Spectre Console Requesting Data User 1 related to Wprowadzenie typu Boolean i dlaczego Prompt jest lepszy

W tym miejscu Tim przechodzi do bardziej elastycznego API — Prompt — które działa bardziej jak mini klasa, którą można dostosować.

Używanie TextPrompt do wyborów

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"));
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ępną opcję.

Spectre Console Requesting Data User 2 related to Używanie TextPrompt do wyborów

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.

Spectre Console Requesting Data User 3 related to Zadawanie pytań o liczby całkowite z walidacją

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: 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.

Dlaczego 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 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.

Hero Worlddot related to Żądanie danych od użytkownika - seria Spectre Console
Hero Affiliate related to Żądanie danych od użytkownika - seria Spectre Console

Zarabiaj więcej, dzieląc się tym, co kochasz

Tworzysz treści dla deweloperów pracujących z .NET, C#, Java, Python, czy Node.js? Zamień swoją wiedzę specjalistyczną na dodatkowy dochód!

Zespół wsparcia Iron

Jesteśmy online 24 godziny, 5 dni w tygodniu.
Czat
E-mail
Zadzwoń do mnie