10 分鐘或更短時間內在 C# 應用程式中引入命令行參數
[[academy-video-youtube({"vid": "Vxy9pssyCWI", "start_time": "0", "title": "Command Line Arguments in C# Applications in 10 Minutes or Less", "creator": "Tim Corey", "length": "8m 46s"})]]
在建立現代C#應用程式時,開發者常常需要在程式的啟動和行為上有一些彈性。 不需要每一個選項都寫死在程式碼裡,您可以透過允許使用者在啟動時傳遞命令行參數,使您的應用程式變得動態。 這使開發者和使用者都能夠直接通過命令行提供輸入參數,調整應用程式的運行,而不需更改程式碼。
在他的 "Command Line Arguments in C# Applications in 10 Minutes or Less" 十分鐘教學中,Tim Corey 清晰地演示了如何有效地在控制台應用程式和 Windows Forms 應用程式中啟用和處理命令行參數。 本文將按 Tim 的說明一步步整理這些概念。
什麼是命令行參數?
一開始,Tim 解釋了為什麼命令行參數很重要。 他將其比作我們啟動像 Docker 這樣的工具時,需要指定載入的映像或要執行的任務的方式。 同樣地,在C#命令行應用程式中,您可以傳遞參數來定義程式在運行時的行為。
例如,如果您運行一個處理檔案的控制台應用程式,您可能希望透過命令行輸入來指定檔案路徑或模式,而不是修改程式碼。
設置控制台專案
Tim 在 Visual Studio 中開始了一個基本的 .NET 8 控制台應用程式專案。 預設的程式碼僅列印出類似"按回車鍵退出"的訊息,透過 Console.ReadLine() 語句在關閉之前等待使用者輸入。
現在,為了處理命令行輸入,Tim 使用了 args 陣列,這用來儲存執行時傳遞給應用程式的參數。 雖然現代C#控制台應用程式使用全域語句,背後仍有進入點定義為:
static void Main(string[] args)static void Main(string[] args)有時是:
static int Main(string[] args)static int Main(string[] args)這些簽名代表主方法 - 在此處開始執行。 args 參數是一個字串陣列 (string[]),其中包含從命令行提供的所有參數。
Tim 演示了如何使用 foreach 迴圈遍歷 args 陣列:
foreach (var arg in args)
{
Console.WriteLine(arg);
}foreach (var arg in args)
{
Console.WriteLine(arg);
}在此,var arg 代表 args 陣列中的每個字串參數,程式將它們顯示在控制台輸出的每一行。
Tim 指出,雖然全域語句隱藏了諸如類 Program 和 Main 方法的樣板程式碼,但一切仍然一樣運行 - args 陣列始終可用並準備好捕捉命令行參數。
運行控制台應用程式
接下來,Tim 示範了如何測試這個功能。 在 Visual Studio 內正常運行程式不會顯示任何不同,因為沒有提供命令行輸入。
為了正確測試,他手動修改了執行過程:他打開檔案總管,導航至專案的 bin → Debug → net8.0 資料夾,並從該路徑啟動終端窗口。
從那裡,他使用以下命令:
ConsoleArgs.exe "hello world" -t timingConsoleArgs.exe "hello world" -t timing此命令顯示了幾個關鍵點:
引號內的"hello world"被視為一個字串參數,而不是兩個單獨的單詞。
- 標誌 -t 和詞 timing 被視為另外兩個參數。
執行時,控制台輸出顯示:
hello world
-t
timinghello world
-t
timing每個行參數代表 args 陣列中的一個元素。 Tim 解釋說,這確認了命令行參數的正確使用 - 控制台應用程式成功地接收並顯示了在執行期間傳遞的所有參數。
他提到,開發者還可以在從專案目錄運行時使用 .NET run 來代替執行檔路徑:
dotnet run -- "hello world" -t timingdotnet run -- "hello world" -t timing雙劃線 (--) 告訴 .NET 將它之後的所有內容視為程式的命令行參數,而不是 .NET CLI 自身的參數。
處理和解析命令行參數
現在我們可以讀取參數了,Tim 討論了如何智能地處理命令行參數。
例如,如果 -t 是一個期望值的標誌,程式必須知道要將下一個字串參數作為其值來處理。 Tim 顯示,您可以通過檢查 args 陣列中的索引來手動解析這個:
for (int i = 0; i < args.Length; i++)
{
if (args[i] == "-t")
{
var value = args[i + 1];
Console.WriteLine($"Timing parameter: {value}");
}
}for (int i = 0; i < args.Length; i++)
{
if (args[i] == "-t")
{
var value = args[i + 1];
Console.WriteLine($"Timing parameter: {value}");
}
}這樣的方法讓您可以處理命名參數、數字型別,甚至詳細模式標誌。 Tim 指出,開發者通常使用 switch 語句,甚至是外部文件和程式庫來進行更高級的參數解析,但 System 命名空間和 args 陣列已經提供了基本情況所需的所有功能。
擴展至 Windows Forms 應用程式
在演示控制台應用程式後,Tim 轉向了一個 Windows Forms 應用程式(WinForms)。
在生成的程式碼中,Program.cs 文件包含一個靜態的 void Main() 方法,但它還不接受參數。 為了啟用命令行參數,Tim 手動修改了 Main 方法以包括 args 參數:
[STAThread]
static void Main(string[] args)
{
ApplicationConfiguration.Initialize();
Application.Run(new Form1(args.FirstOrDefault() ?? "default"));
}[STAThread]
static void Main(string[] args)
{
ApplicationConfiguration.Initialize();
Application.Run(new Form1(args.FirstOrDefault() ?? "default"));
}他解釋說,args.FirstOrDefault() 從 args 陣列中檢索首個輸入參數(或在無參數傳遞時返回 "default" )。
然後,在 Form1 類中,Tim 更新了構造函式以接受一個字串參數:
public Form1(string name)
{
InitializeComponent();
displayName.Text = name;
}public Form1(string name)
{
InitializeComponent();
displayName.Text = name;
}在此,displayName 是在 Windows Forms Designer 中定義的一個標籤,現在它顯示透過命令行傳遞的參數。
當他在沒有參數的情況下運行程式時,標籤顯示 "default"。 當他再次運行並帶有:
WinFormsArgs.exe "Hello World"WinFormsArgs.exe "Hello World"表單窗口顯示 "Hello World"。
Tim 解釋說,這種技術允許 Windows Forms 應用程式像控制台應用程式一樣支持命令行參數 - 給使用者提供了動態更改啟動行為的能力。
命令行參數的實際用途 (7:18)
Tim 最後討論了這項功能如何使命令行工具更具多樣性。 開發者可以使用命令行參數來:
以不同模式啟動應用程式(例如,黑暗模式 vs 亮光模式)。
在啟動時提供文件路徑或配置資訊。
使用簡單開關如 -v 或 --debug 啟用詳細模式或除錯功能。
- 建立快捷方式來為不同工作流傳遞特定參數。
通過設計主方法來接受字串參數,您可以輕鬆擴展應用程式的靈活性和適應性 - 不需要額外的使用者輸入對話框或配置文件。
總結 (8:15)
他的範例驅動講解表明,處理C#中的命令行參數並不複雜 - 只是要了解每個應用程式都有一個進入點(Main),命令行傳遞的參數作為字串陣列到達。
無論您是處理控制台應用程式還是 Windows Forms 應用程式,這個概念使您的程式能夠動態回應啟動時指定的命令、值和參數。
最終收穫
Tim Corey 的 影片 提供了一個清晰且實用的指南,來正確使用 C# 中的命令行參數。 通過理解 args 參數在 Main 方法中的工作原理,開發人員可以輕鬆建立、解析和使用參數,讓應用程式更為強大且易於配置。
因此,下次構建 C# 專案時,請記住,您的命令行參數不僅僅是技術語法 - 它們是組合您的程式和使用者之間的橋樑,為您的程式碼賦予更多的力量、靈活性和實際可用性。

