從使用者請求資料 - Spectre Console 系列
[[academy-video-youtube({"vid": "fmAClT_yr84", "start_time": "0", "title": "Requesting Data from the User - Spectre Console Series", "creator": "Tim Corey", "length": "10m 10s"})]]
C# 控制台應用程式一直以來都是學習程式如何從使用者讀取輸入並顯示輸出的最簡單方式。 在他的 Spectre.Console 系列中,Tim Corey 展示了如何超越單調的黑白指令提示字元。 在本文中,我們將仔細看看他的影片"Requesting Data from the User - Spectre Console Series",了解他如何收集輸入、處理數值、進行錯誤檢查,並提升程式的友好性 - 所有這些都不需要手動修改模板程式碼。 包含時間戳記,方便您跳到影片的正確位置。
簡介:使指令行輸入更簡單
一開始,Tim 提醒我們 Spectre.Console 可以將普通的 C 指令行輸入轉變為視覺上更吸引人的東西。 不必撰寫完整的 static 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 鍵時,方法讀取輸入,解析為數字型別,並將其儲存在年齡變數中。
布林輸入及為何 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<bool> 能自動處理資料型別,但對於使用者輸入來說並不總是最自然的。

這就是 Tim 轉向更靈活的 API——Prompt 的地方,這更像是一個您可以自定義的小類別。
使用 TextPrompt 進行選擇
在 3:02 時,Tim 從 Ask 換成 Prompt,使用 TextPrompt<string>。 他不使用內建的布林值,而是建立了一個新的文字提示實例,給使用者提供實際選擇:
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 美化命令行,使使用者可以輕鬆看到可接受的答案。 如果您輸入其他任何內容,方法將收到它,並將其與列表進行比對,然後顯示一條友好的消息,告訴您選擇一個可用的選項。

新增預設值
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(),
};
}));這裡提示不僅將字串值從標準輸入流轉換為數字型別,還基於業務規則進行錯誤檢查——如不允許負數值年齡。 Tim 現場測試(8:31):輸入 -1 觸發"您尚未出生。"輸入 150 觸發"您太老了。"只有有效的輸入才能讓程式繼續執行下一行。

這內建的驗證消除了在主函式中手動撰寫 if 語句,調用解析方法和處理異常的需要。
Ask vs Prompt:何時使用
在 9:00,Tim 進行總結:
Ask:快速、簡單。 當程式只需要讀取一個輸入參數並將其轉換為已知型別時,是完美的選擇。
- Prompt:更強大。 允許您新增選擇、預設值和驗證。 在構建更加豐富的控制台應用程式或整合其他透過命令行參數調用您的可執行檔案的程式時非常好用。
這兩種方法仍然可以很好地融入到您的 static 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 Forms 應用程式或工具中。 這是一種現代化方式來處理使用者輸入,同時保持 C# 控制台及其熟悉的主函式的簡單性。

