フッターコンテンツにスキップ
Iron Academy Logo
C#アプリケーション
C#アプリケーション

その他のカテゴリー

ユーザーからのデータ要求 - Spectre Console シリーズ

Tim Corey
10 分 10 秒

C#コンソールアプリケーションは、プログラムがユーザーからの入力を読み取り、出力を表示する方法を学ぶ最も簡単な方法です。 Spectre.Consoleシリーズでは、ティム・コーリーが、白黒のコマンドプロンプトをはるかに超える方法を紹介します。 この記事では、彼のビデオ"Requesting Data from the User - Spectre Console Series"をよく見て、彼がどのように入力を収集し、数値を処理し、エラーチェックを行い、プログラムをより親しみやすいものにするのかを見ていきます。 タイムスタンプが含まれているため、動画内の適切な場所にジャンプできます。

はじめに:コマンドライン入力をより簡単に

冒頭でティムは、Spectre.Consoleが普通のC#コマンドライン入力を視覚的に魅力的なものに変換できることを思い出させてくれる。 静的な void Main(string[ⅳ] args) メソッドを記述し、Console.ReadLine() で標準入力ストリー ムから手動で読み込み、解析し、例外を処理する代わりに、Spectre.Console がそれをラ ップしてくれます。

ティムの言葉(0:17)を借りれば、このセッションでは"ユーザーに入力を求め、データを検証し、適切なデータ型にキャストする"方法を紹介する。

整数値をAskで読み取る

ティムの最初の例(0:35)は、おなじみのものです。 伝統的にC#では、次のように書きます:

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);
}

これは、C#プログラムの古典的なエントリポイント、メイン関数、およびコンソールを介してキーボードから入力パラメータを受信する方法を示しています。 また、int.ParseまたはConvert.ToInt32を使用して、文字列入力をint年齢に変換する必要があります。 ティムは、無効な入力を処理し、例外を自分でスローまたはキャッチしなければならないことを指摘しています。

Spectre.Consoleでは、彼は単純にこう書きます:

int age = AnsiConsole.Ask<int>("What is your age?");
int age = AnsiConsole.Ask<int>("What is your age?");

この1行で入力を読み取り、整数値に変換し、ユーザーが数値以外の文字を入力した場合は赤いエラーメッセージを表示します。 ユーザーがEnterを押すと、メソッドは入力を読み取り、数値型に解析し、age変数に格納します。

ブール入力とプロンプトが良い理由

次へ(1:14) Timがブール値を求めるデモをしています:

bool isHappy = AnsiConsole.Ask<bool>("Are you happy?");
bool isHappy = AnsiConsole.Ask<bool>("Are you happy?");

ユーザーが"true"か"false"を入力すれば、機能します。 しかし、"はい"と入力すると、Spectre.Consoleは赤いエラーを表示します。 これは、Askがデータ型を自動的に処理する一方で、ユーザー入力にとって最も自然であるとは限らないことを示しています。

Spectre Console Requesting Data User 1 related to ブール入力とプロンプトが良い理由

そこでティムは、より柔軟なAPIであるプロンプトに移行しました。プロンプトは、カスタマイズ可能なミニクラスのようなものです。

選択肢にTextPromptを使用する

3:02にTimはTextPromptでAskからPromptに切り替えます。 組み込みのブール値の代わりに、ユーザーに実際の選択肢を与えるテキストプロンプトの新しいインスタンスを作成します:

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"));

プログラムが実行されると(4:48)、コンソールには質問の後に[Yes/No]と表示される。 これは、Spectre.Console がコマンドラインを装飾しているため、ユーザーは受け入れ可能な回答を簡単に確認できます。 それ以外のものを入力すると、メソッドはそれを受け取り、リストと照合し、利用可能なオプションを選択するようにフレンドリーなメッセージを表示します。

Spectre Console Requesting Data User 2 related to 選択肢にTextPromptを使用する

デフォルト値の追加

そして、Timはデフォルトを追加する(5:16):

.DefaultValue("Yes")
.DefaultValue("Yes")

現在では、プログラムの実行時に、ユーザーはEnterを押すだけで、キャリッジ・リターンでテキストを入力することなく、メソッドが自動的に変数に"Yes"を代入します。 これは、メイン・メソッドに余分なコードを書かずに、妥当なデフォルトを保存したい場合に最適です。

検証を伴う整数のプロンプト

6:01にTimは整数入力を使ったより豊かな例を示す。 彼は新しいTextPromptを使用して、再度年齢を尋ねますが、プロンプトの中にバリデーションロジックを追加します:

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(),
            };
        }));

ここでは、プロンプトは標準入力ストリームからの文字列値を数値型に変換するだけでなく、負の年齢を許容しないといったビジネスルールに基づくエラーチェックも行っています。 ティムはライブでテストする(8:31):-1を入力すると、"You were not born yet."(あなたはまだ生まれていません)とトリガーされる。150を入力すると、"あなたは年を取りすぎています "と表示される。有効な入力だけがプログラムを次の行に進める。

Spectre Console Requesting Data User 3 related to 検証を伴う整数のプロンプト

このビルトイン検証により、メイン関数で if 文を手動で記述したり、解析メソッドを呼び出したり、例外を処理したりする必要がなくなります。

Ask vs Prompt:それぞれをいつ使うか

9:00にティムが要約する:

・Ask:迅速で簡単です。 プログラムが1つの入力パラメータを読み取り、既知の型に変換する必要がある場合に最適です。

  • プロンプトより強力に。 選択肢、デフォルト、検証を追加できます。 よりリッチなコンソールアプリケーションを構築したり、コマンドライン引数で実行ファイルを呼び出す他のプログラムと統合したりする場合に最適です。

どちらのアプローチも、static void Main(string[] args)、あるいはpublic static void Main(string[] args)のエントリポイントにきちんと収まります。 また、args にアクセスしてプログラム実行時に渡されるコマンドライン引数を読み込んだり、Spectre.Console のプロンプトと組み合わせたり、string.Format や補間を使ってきれいにフォーマットされた文字列を出力することもできます。

コンソール開発者にとって重要なのはなぜですか?

Timは最後に(9:19)、このアプローチが "ユーザーからの入力を求める能力を次のレベルに引き上げる "ことを指摘している。Spectre.Consoleを使えば、キーボード入力を読み取り、Convertクラスで変換し、デフォルトのメッセージを表示するという繰り返しのコードを書く必要がなくなります。 その代わりに

  • コマンドプロンプトでの豊富なカラー出力。

  • 数値型、ダブル値、文字列値の自動解析。

  • 無効な入力に対する親切なエラー処理。

  • ハイブリッド入力モデルのために、プロンプトと従来のコマンドライン引数を組み合わせる能力。

これにより、Visual Studioやその他のエディタでプロ級のコンソールアプリケーションを書きながら、メインメソッド、データ型、入力パラメータについて初心者に教えることが容易になります。

結論

動画にあるティム・コーリーのウォークスルーに従うことで、あなたは学ぶことができます:

・Spectre.ConsoleのAskを使って、ユーザー入力を読み取り、変換する方法。

・TextPromptを使って選択肢やデフォルト、検証を提示する方法。

  • これらのプロンプトが、コマンドライン引数と並んで、Main(string[◆]args)エントリポイントにどのように自然に収まるか。

  • 定型エラーチェックを減らし、コマンドラインアプリをより使いやすくする方法。

Tim が紹介するものはすべて、コマンドプロンプトから実行したり、引数を渡したり、より大きな Windows Forms アプリケーションやツールに組み込んだりできる、単一の実行可能ファイルにコンパイルされたままです。 C# コンソールのシンプルさと使い慣れたメイン機能を維持しながら、ユーザーからの入力を処理する現代的な方法です。

Hero Worlddot related to ユーザーからのデータ要求 - Spectre Console シリーズ
Hero Affiliate related to ユーザーからのデータ要求 - Spectre Console シリーズ

好きなことを共有することで収入を増やす

.NET、C#、Java、Python、またはNode.jsを使用する開発者向けのコンテンツを作成しますか?あなたの専門知識を副収入に変えましょう!

アイアンサポートチーム

私たちは週5日、24時間オンラインで対応しています。
チャット
メール
電話してね