顶级语句 - 不使用 Main
方法的程序
无需在控制台应用程序项目中显式包含 Main
方法。 相反,可以使用顶级语句功能最大程度地减少必须编写的代码。
使用顶级语句可直接在文件的根目录中编写可执行代码,而无需在类或方法中包装代码。
这意味着无需使用 Program
类和 Main
方法即可创建程序。
在这种情况下,编译器将使用入口点方法为应用程序生成 Program
类。 生成方法的名称不是 Main
,而是你的代码无法直接引用的实现详细信息。
下面是一个 Program.cs 文件看,它是 C# 10 中的一个完整 C# 程序:
Console.WriteLine("Hello World!");
借助顶级语句,可以为小实用程序(如 Azure Functions 和 GitHub Actions)编写简单的程序。 它们还使初次接触 C# 的程序员能够更轻松地开始学习和编写代码。
以下各节介绍了可对顶级语句执行和不能执行的操作的规则。
仅能有一个顶级文件
一个应用程序只能有一个入口点。 一个项目只能有一个包含顶级语句的文件。 在项目中的多个文件中放置顶级语句会导致以下编译器错误:
CS8802:只有一个编译单元可具有顶级语句。
一个项目可具有任意数量的其他源代码文件,这些文件不包含顶级语句。
没有其他入口点
可以显式编写 Main
方法,但它不能作为入口点。 编译器将发出以下警告:
CS7022:程序的入口点是全局代码;忽略“Main()”入口点。
在具有顶级语句的项目中,不能使用 -main 编译器选项来选择入口点,即使该项目具有一个或多个 Main
方法。
using
指令
如果包含 using
指令,这些指令必须先出现在文件中,如以下示例中所示:
using System.Text;
StringBuilder builder = new();
builder.AppendLine("The following arguments are passed:");
// Display the command line arguments using the args variable.
foreach (var arg in args)
{
builder.AppendLine($"Argument={arg}");
}
Console.WriteLine(builder.ToString());
// Return a success code.
return 0;
全局命名空间
顶级语句隐式位于全局命名空间中。
命名空间和类型定义
具有顶级语句的文件还可以包含命名空间和类型定义,但它们必须位于顶级语句之后。 例如:
MyClass.TestMethod();
MyNamespace.MyClass.MyMethod();
public class MyClass
{
public static void TestMethod()
{
Console.WriteLine("Hello World!");
}
}
namespace MyNamespace
{
class MyClass
{
public static void MyMethod()
{
Console.WriteLine("Hello World from MyNamespace.MyClass.MyMethod!");
}
}
}
args
顶级语句可以引用 args
变量来访问输入的任何命令行参数。 args
变量永远不会为 null,但如果未提供任何命令行参数,则其 Length
将为零。 例如:
if (args.Length > 0)
{
foreach (var arg in args)
{
Console.WriteLine($"Argument={arg}");
}
}
else
{
Console.WriteLine("No arguments");
}
await
可以通过使用 await
来调用异步方法。 例如:
Console.Write("Hello ");
await Task.Delay(5000);
Console.WriteLine("World!");
进程的退出代码
若要在应用程序结束时返回 int
值,请像在 Main
方法中返回 int
那样使用 return
语句。 例如:
string? s = Console.ReadLine();
int returnValue = int.Parse(s ?? "-1");
return returnValue;
隐式入口点方法
编译器会生成一个方法,作为具有顶级语句的项目的程序入口点。 方法的签名取决于顶级语句是包含 await
关键字还是 return
语句。 下表显示了方法签名的外观,为了方便起见,在表中使用了方法名称 Main
。
顶级代码包含 | 隐式 Main 签名 |
---|---|
await 和 return |
static async Task<int> Main(string[] args) |
await |
static async Task Main(string[] args) |
return |
static int Main(string[] args) |
否 await 或 return |
static void Main(string[] args) |
C# 语言规范
有关详细信息,请参阅 C# 语言规范。 该语言规范是 C# 语法和用法的权威资料。