提示
剛開始開發軟體嗎? 先從 入門 教學開始。 那些教學會用 頂層語句,對新應用來說比較簡單。
使用現有的程式碼庫? 許多現有應用程式採用 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可返回void、int、Task或Task<int>。 - 唯有
Main傳回Task或Task<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 。 如果你不需要回傳退出碼,請使用 void 或 Task。 如果您需要呼叫非同步方法,請使用 async 搭配 Task 或 Task<int> 返回類型。
Main() 傳回值
當你返回 int 或 Task<int>時,你的程式可以將狀態資訊傳送給執行檔的其他程式或腳本。 回傳值 0 通常代表成功,非零值則表示有錯誤。
以下範例回傳一個出口代碼:
class MainReturnValTest
{
static int Main()
{
//...
return 0;
}
}
執行程式後,你可以檢查退出代碼。 在 PowerShell 中,使用 $LastExitCode. 在批次檔案或 shell 腳本中,請使用 %ERRORLEVEL%。
如果你的 Main 方法使用 await,請將它宣告為 async 或 Task、Task<int> 返回型別。 執行時會呼叫 Main 並等待 return Task 完成後,程序才會退出。 回傳類型不能是 void 或 int,因為 async 修飾符需要一個執行階段可以等待的回傳類型——void 和 int 不代表正在進行的工作,因此程序可能會在非同步操作 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 為零。
你可以透過使用 Parse 或 Convert將字串參數轉換成其他型別:
long num = long.Parse(args[0]);
提示
剖析命令列引數可能很複雜。 可以考慮使用 System.CommandLine 函式庫來簡化流程。
欲取得有效範例,請參見 「如何顯示命令列參數」。
C# 語言規格
如需詳細資訊,請參閱<C# 語言規格>。 語言規格是 C# 語法及用法的限定來源。