共用方式為


Main() 和命令列引數

提示

剛開始開發軟體嗎? 先從 入門 教學開始。 那些教學會用 頂層語句,對新應用來說比較簡單。

使用現有的程式碼庫? 許多現有應用程式採用 Main 明確的方法。 本文將說明其運作方式及有效使用方法。

當你啟動 C# 應用程式時,執行時會呼叫該 Main 方法。 Main 方法是 C# 應用程式的進入點。

C# 程式只能有一個入口點。 如果你有多個包含某 Main 個方法的類別,編譯程式時必須使用 StartupObject 編譯器選項來指定哪個 Main 方法作為入口點。 如需詳細資訊,請參閱 StartupObject (C# 編譯器選項)。 以下範例顯示命令列參數的數量作為其第一個動作:

class TestClass
{
    static void Main(string[] args)
    {
        Console.WriteLine(args.Length);
    }
}

概觀

這個 Main 方法是可執行程式的入口。 程式啟動時,執行時會先呼叫 Main,然後才執行其他程式碼。 當Main返回時,程式結束。 你用以下規則宣告 Main

  • 你必須在類別或結構中宣告 Main 。 封閉的 class 可以是 static
  • Main 必須是 static
  • Main 可以有任何 存取修正值
  • Main 可返回 voidintTaskTask<int>
  • 唯有Main傳回TaskTask<int>時,Main的宣告才能包含async修飾詞。 此規則特別排除方法 async void Main
  • 你可以宣告 Main 方法,它可以包含或不包含含有命令列參數的 string[] 參數。 當你使用 Visual Studio 建立 Windows 應用程式時,你可以手動新增參數,或使用 GetCommandLineArgs() 該方法取得命令列參數。 參數是零索引的命令列參數。 與 C 和 C++ 不同,程式的名稱不會作為陣列中的args 第一個命令列參數,但它是GetCommandLineArgs() 方法的第一個元素。

以下列表顯示Main宣告的排列組合:

static void Main() { }
static int Main() { }
static void Main(string[] args) { }
static int Main(string[] args) { }
static async Task Main() { }
static async Task<int> Main() { }
static async Task Main(string[] args) { }
static async Task<int> Main(string[] args) { }

前面的範例未指定存取修飾詞,因此預設情況下它們會隱含為 private。 你可以指定任何明確的存取修飾符。

下表總結了所有有效 Main 簽章及使用時機:

Main 宣告 用途 args 包含 await 回傳退出代碼
static void Main() No No No
static int Main() No No 是的
static void Main(string[] args) 是的 No No
static int Main(string[] args) 是的 No 是的
static async Task Main() No 是的 No
static async Task<int> Main() No 是的 是的
static async Task Main(string[] args) 是的 是的 No
static async Task<int> Main(string[] args) 是的 是的 是的

選擇最簡單的簽名,最適合你的需求。 如果你不需要命令列參數,就省略參數 string[] args 。 如果你不需要回傳退出碼,請使用 voidTask。 如果您需要呼叫非同步方法,請使用 async 搭配 TaskTask<int> 返回類型。

Main() 傳回值

當你返回 intTask<int>時,你的程式可以將狀態資訊傳送給執行檔的其他程式或腳本。 回傳值 0 通常代表成功,非零值則表示有錯誤。

以下範例回傳一個出口代碼:

class MainReturnValTest
{
    static int Main()
    {
        //...
        return 0;
    }
}

執行程式後,你可以檢查退出代碼。 在 PowerShell 中,使用 $LastExitCode. 在批次檔案或 shell 腳本中,請使用 %ERRORLEVEL%

如果你的 Main 方法使用 await,請將它宣告為 asyncTaskTask<int> 返回型別。 執行時會呼叫 Main 並等待 return Task 完成後,程序才會退出。 回傳類型不能是 voidint,因為 async 修飾符需要一個執行階段可以等待的回傳類型——voidint 不代表正在進行的工作,因此程序可能會在非同步操作 int 結束前退出。 如果您不需要出口代碼,請使用Task;如果需要出口代碼,請使用Task<int>

class Program
{
    static async Task<int> Main(string[] args)
    {
        return await AsyncConsoleWork();
    }

    private static async Task<int> AsyncConsoleWork()
    {
        return 0;
    }
}

命令列引數

Main宣告中包含string[] args參數以接受命令列參數。 如果不需要,就省略參數。 參數 args 是一個 String 永不空的陣列——如果沒有提供參數,則 Length 為零。

你可以透過使用 ParseConvert將字串參數轉換成其他型別:

long num = long.Parse(args[0]);

提示

剖析命令列引數可能很複雜。 可以考慮使用 System.CommandLine 函式庫來簡化流程。

欲取得有效範例,請參見 「如何顯示命令列參數」。

C# 語言規格

如需詳細資訊,請參閱<C# 語言規格>。 語言規格是 C# 語法及用法的限定來源。