提示
开发软件的新手? 首先开始 学习入门 教程。 这些教程使用 顶级语句,这对于新应用来说更简单。
使用现有代码库? 许多现有应用程序使用显式 Main 方法。 本文介绍了其工作原理以及如何有效地使用它。
启动 C# 应用程序时,运行时将调用该方法 Main 。
Main 方法是 C# 应用程序的入口点。
C# 程序只能有一个入口点。 如果有多个类具有方法Main,则必须在编译程序以指定哪个方法用作入口点时使用 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() |
否 | 否 | 否 |
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) |
是的 | 是的 | 是的 |
选择最符合需求的签名。 如果不需要命令行参数,请省略该 string[] args 参数。 如果不需要返回退出代码,请使用 void 或 Task。 如果需要调用异步方法,请使用asyncTask或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,并等待返回的 Task 完成,然后进程退出。 返回类型不能 void 或 int 因为 async 修饰符需要运行时可以等待的返回类型,void 并且 int 不表示正在进行的工作,因此进程可以在异步操作完成之前退出。 当不需要退出代码时使用Task,需要退出代码时使用Task<int>。
class Program
{
static async Task<int> Main(string[] args)
{
return await AsyncConsoleWork();
}
private static async Task<int> AsyncConsoleWork()
{
return 0;
}
}
命令行参数
在string[] args声明中包括一个Main参数以接受命令行参数。 如果不需要它们,请省略参数。 参数 args 是一个 String 数组,并且永远都不为 null —— 如果未提供任何参数,该数组的Length 为零。
可以使用以下方法ParseConvert将字符串参数转换为其他类型的参数:
long num = long.Parse(args[0]);
提示
分析命令行参数可能比较复杂。 请考虑使用 System.CommandLine 库来简化该过程。
有关工作示例,请参阅 如何显示命令行参数。
C# 语言规范
有关详细信息,请参阅 C# 语言规范。 该语言规范是 C# 语法和用法的权威资料。