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

其他分類

10分鐘內的C#應用命令行參數

Tim Corey
8m 46s

在構建現代C#應用程式時,開發者經常需要靈活地控制程式啟動和行為。 不必將每個選項硬編碼,您可以透過允許用戶傳遞命令列參數來啟動應用程式,使其具有動態特性。 這使開發者和用戶都可以直接通過命令列提供輸入參數,調整應用程式的運行方式而不必更改程式碼。

在他精練的10分鐘教學"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 timing
ConsoleArgs.exe "hello world" -t timing

此命令演示了幾個關鍵點:

  • 使用引號包圍的"hello world"被視為一個字串參數,而不是兩個單獨的詞。

  • 標誌-t和單字timing被視為兩個額外的參數。

執行時,控制台輸出顯示:

hello world  
-t  
timing
hello world  
-t  
timing

每行參數代表args陣列中的一個元素。 Tim解釋,這確認了命令列參數的正確使用——控制台應用程式成功接收並顯示所有執行期間傳遞的參數。

他提到當在專案目錄中運行時,開發者可以使用dotnet run而不是可執行路徑:

dotnet run -- "hello world" -t timing
dotnet 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陣列中檢索第一個輸入參數(如果沒有提供參數,則返回"預設")。

然後,在Form1類中,Tim更新構造函數以接受一個字串參數:

public Form1(string name)
{
    InitializeComponent();
    displayName.Text = name;
}
public Form1(string name)
{
    InitializeComponent();
    displayName.Text = name;
}

這裡,displayName是Windows Forms設計師中定義的一個標籤,現在顯示通過命令列傳遞的參數。

當他不帶參數運行程式時,標籤顯示"預設"。當他再次運行帶有:

WinFormsArgs.exe "Hello World"
WinFormsArgs.exe "Hello World"

表單窗口顯示"Hello World"。

Tim解釋說,這種技術允許Windows Forms應用程式像控制台應用程式一樣支援命令列參數——讓用戶能夠動態更改啟動行為。

命令列參數的實用性(7:18)

Tim總結討論了此功能如何使命令列工具變得多元化。 開發者可以使用命令列參數來:

  • 以不同模式啟動應用程式(例如,黑暗模式對比明亮模式)。

  • 在啟動時提供文件路徑或配置選項。

  • 使用簡單的開關如-v或--debug啟用詳細模式或調試功能。

  • 創建快捷方式以傳遞特定參數以實現不同的工作流程。

通過設計主方法以接受字串參數,您可以輕鬆地擴展應用程式的靈活性和適應能力——而不需要額外的用戶輸入對話框或配置文件。

結論(8:15)

他的範例驅動解釋顯示處理C#中命令列參數並不複雜——只需理解每個應用程式都有一個進入點(Main),命令列傳遞的參數會作為字串陣列到達那裡。

無論您是在處理控制台應用程式還是Windows Forms應用程式,這個概念可以使您的程式能夠動態響應啟動時指定的命令、值和參數。

最終收穫

Tim Corey的影片 提供了一個清晰、實用的指南,教您如何正確使用C#中的命令列參數。 透過了解args參數在Main方法中的運作方式,開發者可以輕鬆生成、解析和使用參數,從而創建更強大且可配置的應用程式。

所以下次當您建構C#專案時,請記住,您的命令列參數不僅僅是技術語法——它們是您程式與用戶之間的橋樑,使您的程式碼更具力量、靈活性和現實的可用性。

Hero Worlddot related to 10分鐘內的C#應用命令行參數
Hero Affiliate related to 10分鐘內的C#應用命令行參數

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

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

鋼鐵支援團隊

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