跳過到頁腳內容
Iron Academy Logo
C# 應用程式
C# 應用程式

其他分類

向使用者請求數據 - Spectre Console系列

Tim Corey
10m 10s

C# 控制台應用程式一直都是學習程式如何從使用者讀取輸入並顯示輸出的最簡單方式。 在他的 Spectre.Console 系列中,Tim Corey 示範了如何超越單純的黑白命令提示符。 在這篇文章中,我們將仔細查看他的影片"Requesting Data from the User - Spectre Console Series",看看他如何收集輸入、處理數值、進行錯誤檢查,並給程式一個更友好的界面——而無需手動修改樣板代碼。 我們還提供時間戳,方便您直接跳到影片中對應的片段。

簡介:輕鬆處理命令行輸入

一開始,Tim 提醒我們 Spectre.Console 可以將普通的 C 命令行輸入轉變成視覺上更吸引人的東西。 不需要撰寫完整的靜態 void Main(string[] args) 方法,然後再手動從標準輸入流中使用 Console.ReadLine() 讀取、解析並處理例外狀況,Spectre.Console 已為您包裝好這一切。

用 Tim 的話來說(0:17),這次課程將展示如何"要求使用者輸入數據、驗證數據並將其轉換為適當的數據類型"——這是任何控制台或命令提示符開發人員的核心技能。

使用 Ask 讀取整數值

Tim 的第一個示例(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 型的年齡。 Tim 指出,您必須自己處理無效輸入並主動丟擲或捕捉例外。

使用 Spectre.Console,他只需要這樣寫:

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

這一行不僅讀取輸入,將它轉換為整數值,還會在使用者輸入非數字字符時顯示紅色錯誤消息——不需要額外的錯誤檢查代碼。 當使用者按下 Enter,方法讀取輸入,將其解析為數值類型,並將其存儲在 age 變數中。

布林值輸入及 Prompt 為何更好

接下來 (1:14),Tim 演示詢問布林值:

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

如果使用者輸入"true"或"false",程序可以正常運行。 但如果他們輸入"yes",Spectre.Console 會顯示紅色錯誤。 這顯示了雖然 Ask 自動處理數據類型,但對於用戶輸入來說並不總是最自然的。

Spectre Console Requesting Data User 1 related to 布林值輸入及 Prompt 為何更好

這時,Tim 轉向更靈活的 API——Prompt,這就像一個小型的類,您可以自定義。

使用 TextPrompt 提供選項

在 3:02,Tim 從 Ask 切換到使用 Prompt 與 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"));

當程序執行時(4:48),控制台會在問題後顯示 [Yes/No]。 這是 Spectre.Console 為命令行添加的裝飾,讓使用者可以輕易看到可接受的答案。 如果您輸入其他內容,該方法會接收它,將其與列表進行比較,然後顯示一條友好的消息告訴您選擇可用的選項。

Spectre Console Requesting Data User 2 related to 使用 TextPrompt 提供選項

添加預設值

然後 Tim 添加了一個預設值 (5:16):

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

現在,程序執行時,用戶只需按下 Enter 鍵——不需要輸入任何文字,方法會自動將"是"分配給變數。 當您希望在主方法中無需額外編碼而存儲合理的默認值時,這真是不可多得的好方法。

驗證整數輸入

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

這裡,提示不僅將標準輸入流的字串值轉換為數字類型,還根據業務規則進行錯誤檢查——比如不允許負年齡。 Tim 現場進行了測試 (8:31):輸入 -1 觸發"您尚未出生。",輸入 150 觸發"您太老了。"只有有效的輸入才能讓程式繼續執行下一行。

Spectre Console Requesting Data User 3 related to 驗證整數輸入

這種內建的驗證消除了在主函數中手動書寫 if 判斷式、調用解析方法和處理例外的需要。

Ask 與 Prompt:何時使用

在 9:00,Tim 做了總結:

  • Ask:快速而簡單。 當您的程序只需要讀取一個輸入參數並將其轉換為已知類型時,非常完美。

  • Prompt:更強大。 它讓您可以添加選項、默認值和驗證功能。 當您構建一個更豐富的控制台應用程式或與其他以命令行參數调用可執行檔的程式結合時,絕佳選擇。

這兩種方法仍然可以完美適應您的靜態 void Main(string[] args) 或甚至是 public static void Main(string[] args) 的入口點。 您還可以訪問 args 以閱讀在程式執行時傳遞的命令行參數,並將其與 Spectre.Console 提示結合,然後使用 string.Format 或內插字符串輸出整潔的格式化字符串。

這對控制台開發人員的重要性

Tim 結尾時 (9:19) 指出,這種方法"將您要求使用者輸入的能力提升到了一個新的層次。" 有了 Spectre.Console,您再也不需要編寫重複性的代碼來讀取鍵盤輸入,使用 Convert 類轉換並顯示默認消息。 相反,您將會:

  • 在命令提示符中以彩色顯示豐富的輸出。

  • 自動解析數值類型、雙精度值或字符串值。

  • 對無效輸入提供友好的錯誤處理。

  • 能夠將提示與傳統的命令行參數結合,實現混合輸入模型。

這使得向初學者教授主方法、數據類型和輸入參數變得更容易,同時仍然在 Visual Studio 或其他任何編輯器中編寫專業級控制台應用程式。

結論

通過跟隨 Tim Corey 在影片中的說明,您將學到:

  • 如何使用 Spectre.Console 的 Ask 來讀取和轉換用戶輸入。

  • 如何使用 TextPrompt 來提供選項、默認值和驗證功能。

  • 這些提示如何自然地融入到您的 Main(string[] args) 入口點,並與命令行參數一起使用。

  • 如何減少樣板錯誤檢查並讓您的命令行應用程式更具友好性。

Tim 示範的所有內容仍然可以編譯成一個可從命令提示符運行的單個可執行文件,並可傳遞參數或嵌入到更大的 Windows 表單應用程式或工具中。 這是一種在保持 C# 控制台及其熟悉的主函數簡潔性的同時,處理用戶輸入的現代方法。

Hero Worlddot related to 向使用者請求數據 - Spectre Console系列
Hero Affiliate related to 向使用者請求數據 - Spectre Console系列

通過分享您所愛的東西賺得更多

您是否在為使用.NET、C#、Java、Python或Node.js的開發者創建內容?將您的專業知識轉化為額外收入!

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我