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

Inne Kategorie

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

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.

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 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 dłączego 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życie TextPrompt do wyboru

O godzinie 3:02 Tim przechodzi z Ask do Prompt z TextPrompt. 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ępna opcja.

Spectre Console Requesting Data User 2 related to Użycie TextPrompt do wyboru

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

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!

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie