项目可以有任意数量的没有顶级语句的源代码文件。
- 没有其他入口
可以显式编写方法 Main ,但它不能用作入口点。 编译器将发出以下警告:
CS7022:程序的入口点是全局代码;忽略"Main()"入口点。
在具有顶级语句的项目中,不能使用 -main 编译器选项来选择入口点,即使该项目具有一个或多个 Main 方法。
- using引用
对于包含顶级语句的单个文件, using 指令必须首先出现在该文件中,如以下示例所示:

using System.Text;
StringBuilder builder = new();
builder.AppendLine("The following arguments are passed:");
foreach (var arg in args)
{
builder.AppendLine($"Argument={arg}");
}
Console.WriteLine(builder.ToString());
return 0;

同时,顶级语句隐式位于全局命名空间Global using中。
- 命名空间和类型定义
具有顶级语句的文件还可以包含命名空间和类型定义,但它们必须位于顶级语句之后。 例如:

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!");
- 隐式入口方法
编译器会生成一个方法,作为具有顶级语句的项目的程序入口点。 方法的签名取决于顶级语句是包含 await 关键字还是 return 语句。
下表显示了方法签名的外观,使用表中的方法名称 Main 来方便起见。
