通过


Main() 和命令行参数

提示

开发软件的新手? 首先开始 学习入门 教程。 这些教程使用 顶级语句,这对于新应用来说更简单。

使用现有代码库? 许多现有应用程序使用显式 Main 方法。 本文介绍了其工作原理以及如何有效地使用它。

启动 C# 应用程序时,运行时将调用该方法 MainMain 方法是 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 可以返回 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()
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 参数。 如果不需要返回退出代码,请使用 voidTask。 如果需要调用异步方法,请使用asyncTaskTask<int>返回类型。

Main() 返回值

返回 intTask<int>返回时,程序可以将状态信息发送到运行可执行文件的其他程序或脚本。 返回值 0 通常表示成功,非零值表示存在错误。

以下示例返回退出代码:

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

运行程序后,可以检查退出代码。 在 PowerShell 中,使用 $LastExitCode。 在批处理文件或 shell 脚本中,使用 %ERRORLEVEL%

如果 Main 方法使用 await,请将其声明为 async 具有 TaskTask<int> 返回类型。 运行时调用 Main,并等待返回的 Task 完成,然后进程退出。 返回类型不能 voidint 因为 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# 语法和用法的权威资料。