一、基本语法要求
-
方法签名:
-
static关键字:
Main 必须是静态方法,属于类而非实例
- 程序启动时无需创建类实例即可调用
-
返回类型:
void :不返回任何值
int :返回程序退出状态码
-
参数:
string[] args :接收命令行参数的可选数组
- 参数可以省略(不接收命令行参数时)
二、标准用法示例
示例1:基础形式
using System;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
// 处理命令行参数
foreach (var arg in args)
{
Console.WriteLine($"参数: {arg}");
}
}
}
示例2:带返回值的版本
using System;
class Program
{
static int Main(string[] args)
{
if (args.Length == 0)
{
Console.Error.WriteLine("错误:需要输入参数");
return 1; // 非零表示错误
}
Console.WriteLine($"接收参数: {args[0]}");
return 0; // 成功执行
}
}
示例3:无参数版本
using System;
class Program
{
static void Main()
{
Console.WriteLine("这是一个不需要命令行参数的程序");
}
}
三、重要注意事项
-
入口点唯一性:
- 每个程序只能有一个
Main 方法作为入口点
- 当存在多个可能的入口点时,需要通过编译器选项指定
-
默认签名:
- 如果不显式指定返回类型或参数,编译器默认使用
static void Main(string[] args)
-
大小写敏感:
-
访问修饰符:
- 虽然通常不指定,但
Main 方法实际上默认为private
- 可以显式声明为
public ,但这不影响其作为入口点的功能
四、高级用法
异步Main方法(C# 7.1+)
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
await Task.Delay(1000);
Console.WriteLine("异步Main方法");
}
}
返回Task<int>的版本
using System;
using System.Threading.Tasks;
class Program
{
static async Task<int> Main(string[] args)
{
await Task.Delay(1000);
return args.Length; // 返回参数个数作为状态码
}
}
五、最佳实践建议
- 对于简单控制台程序,使用
static void Main(string[] args) 即可
- 需要返回状态码时使用
static int Main(string[] args)
- 涉及异步操作时考虑使用
async Task 或async Task<int> 版本
- 对命令行参数进行有效性检查
- 考虑使用专业的命令行参数解析库(如System.CommandLine)处理复杂参数
六、常见错误提示
- 没有Main方法
- Main方法写成了main方法
- 没有用static
Main方法的返回值没有写
存在多个Main方法,可以在菜单:项目->"XXX和属性"->应用程序->启动对象,这里指定一个项目启动。
|