C# 中的 main() 方法

本文关键字:方法 main 中的 | 更新日期: 2023-09-18 11:27:08

Main()方法是 .NET 或 .NET Core 平台上控制台和 Windows 应用程序的入口点。它也是 ASP.NET 核心Web应用程序的入口。

运行应用程序时,它会从 Main() 方法开始执行。因此,程序只能有一个Main()方法作为入口点。 但是,一个类可以有多个Main()方法,但其中任何一个都可以是应用程序的入口点。

Main()方法可以通过多种方式定义。以下是Main()方法的有效签名。

Main() Method Signatures for Entry Point

//parameterless Main() methods
public static void Main() { }
public static int Main() { }
public static async Task Main() { }
public static async Task<int> Main() { }
//Main() methods with string[] parameter
public static void Main(string[] args) { }
public static int Main(string[] args) { }
public static async Task Main(string[] args) { }
public static async Task<int> Main(string[] args) { }

以下是控制台应用程序的默认Main()方法。

示例: Main() Method

class Program
{
    static void Main(string[] args)
    {
        //program execution starts from here
        Console.WriteLine("Command line Arguments: {0}", args.length)
    }
}

在上面的示例中,控制台应用程序的执行从 Main() 方法开始。 string[] args 参数包含在从命令提示符/终端执行应用程序时从命令行传递的值。 学习how to pass the command-line arguments to C# console application .

请注意,Main() 方法中不能包含其他类型的参数。例如,下面将抛出 Program 类不包含适用于入口点错误的静态Main()方法。

Invalid Main() Methods As Entry Point

static void Main(string args) {
}
static void Main(string[] args, int id) {
}
static void Main(bool isStarting) {
}

从 C# 9 (.NET 5) 开始,可以使用top-level statements功能省略Main()方法。 但是,您只能在一个 cs 文件中编写顶级语句。

示例: Top-level Statements as Entry Point in C# 9

using System;
Console.WriteLine("This is considered as an entry point");

无参数 main() 方法(Parameterless Main() Method)

如果不打算传递任何命令行参数,则 Main() 方法可以是无参数的。例如,下面是作为入口点的有效Main()方法。

示例: Parameterless Main() Method

class Program
{
    static void Main()
    {
        //program execution starts from here
    }
}

main() 方法的返回类型(Return Type of the Main() Method)

Main()方法可以有voidintTaskTask<int>作为返回类型。 返回intTask<int>会将状态信息传达给开始执行的程序。 从Main()返回 0 将表示成功,返回非零将表示失败。

示例:

static int Main(string[] args)
{
    //indicates success
    return 0;
}
static int Main(string[] args)
{
    //indicates failure
    return 1;
}

异步主方法(Asynchronous Main Method)

Main()方法也可以使用 async 关键字异步。异步Main()方法的返回类型可以是 TaskTask<int>

示例: Asynchronous Main() Methods

//Use of Task return type in the Main() method
public static async Task Main()
{
}
public static async Task Main(string[] args)
{
}
public static async Task<int> Main()
{
}
public static async Task<int> Main(string[] args)
{
}

主方法重载 (Overloading of the Main Method )

Main()方法可以出于不同的目的重载。但是,类或结构只能有一个有效的Main()方法签名作为入口点;其他Main()方法可以使用其他签名,如下所示。

示例: Overloading of Main() Method

class Program
{
    //entry point
    static void Main()
    {
        Console.WriteLine("This is the entry point");
        Main(10);
    }
    //overload Main method
    static void Main(int a)
    {
        Console.WriteLine(a);
        Main(10, 20);
    }
    //overload Main method
    static void Main(int a, int b)
    {
        Console.WriteLine(a, b);
    }
}

下面的示例演示 Main() 方法的无效重载,因为类包含 Main() 方法的两个有效签名作为入口点。

Error: Can't have multiple Main() entry point

class Program
{
    //can't have multiple valid Main() entry points
    //valid entiry point
    static void Main(string[] args)
    {
    }
    //valid entry point
    static void Main()
    {
    }
}

配置启动对象(Configure Startup Object)

如果多个类具有有效的Main()方法,则可以使用应用程序的 Startup Object 属性将其中任何一个类配置为入口点。

示例: Multiple Main() Methods

namespace MainMethodDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Program.Main() Entry Point");
        }
    }
    class WindowProgram
    {
        static void Main(string[] args)
        {
            Console.WriteLine("WindowProgram.Main() Entry Point");
        }
    }
}

在上面的示例中,两个类包含有效的Main()方法。若要指定哪个Main()方法应作为入口点,请在解决方案资源管理器中右键单击项目节点,然后单击"Properties"。然后,在"属性"页和"Application"选项卡中,在Startup Object下拉列表中选择应调用其 Main() 方法的类名,如下所示。

配置启动对象

总结:

  • Main()方法是程序执行开始和结束的可执行程序的入口点。
  • 它可以声明为公共、私有、受保护或内部访问修饰符。
  • 方法名称必须Main() 。它不能是任何其他名称。
  • 它必须是静态的,并在类或结构中声明。
  • 它只能具有string[]类型参数。
  • 返回类型可以是 void、int、Task 或 Task
  • Main()方法不能重写,也不能声明为虚拟或抽象。
  • 允许使用多种Main()方法,但只能将一种方法配置为入口点。
  • 对于 Windows 应用程序,可以手动添加输入参数,也可以使用 GetCommandLineArgs() 方法来获取命令行参数。
  • 在 C# 9 (.NET 5) 中,通过使用类中的顶级语句,可以省略 Main() 方法。

本文内容总结: