.NET 10 C# 14 New Features 新增功能介绍-再看Top Level Program
无需使用Program类和Main方法即可创建程序。 在这种情况下编译器将使用入口点方法为应用程序生成Program类。 生成方法的名称不是Main而是你的代码无法直接引用的实现详细信息。下面是一个Program.cs文件该文件是完整的 C# 程序Console.WriteLine(Hello World!);借助顶级语句可以编写简单的程序应用。 方便初次接触 C# 的程序员能够更轻松地开始学习和编写代码。以下各节介绍了可对顶级语句执行和不能执行的操作的规则。1. 只有一个包含顶级语句的文件一个应用程序只能有一个入口点。 一个项目只能有一个包含顶级语句的文件。 在项目中的多个文件中放置顶级语句会导致以下编译器错误CS8802只有一个编译单元可具有顶级语句。项目可以有任意数量的没有顶级语句的源代码文件。2. 没有其他入口可以显式编写方法Main但它不能用作入口点。 编译器将发出以下警告CS7022程序的入口点是全局代码忽略“Main()”入口点。在具有顶级语句的项目中不能使用 -main 编译器选项来选择入口点即使该项目具有一个或多个Main方法。3. 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中。4. 命名空间和类型定义具有顶级语句的文件还可以包含命名空间和类型定义但它们必须位于顶级语句之后。 例如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!); } } }5. args入参顶级语句可以引用args变量来访问输入的任何命令行参数。args变量永远不会为 null但如果未提供任何命令行参数则其Length将为零。 例如if (args.Length 0) { foreach (var arg in args) { Console.WriteLine($Argument{arg}); } } else { Console.WriteLine(No arguments); }6. await异步调用调用await来执行异步方法。 例如Console.Write(Hello ); await Task.Delay(5000); Console.WriteLine(World!);7. 隐式入口方法编译器会生成一个方法作为具有顶级语句的项目的程序入口点。 方法的签名取决于顶级语句是包含await关键字还是return语句。下表显示了方法签名的外观使用表中的方法名称Main来方便起见。