找回密码
 立即注册
首页 业界区 业界 .NET 10 & C# 14 New Features 新增功能介绍-再看Top Le ...

.NET 10 & C# 14 New Features 新增功能介绍-再看Top Level Program

珠尿娜 昨天 10:20
上篇文章给大家分享了
.NET 10 & C# 14 New Features 新增功能介绍-扩展成员Extension Members

今天又看了一遍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 指令必须首先出现在该文件中,如以下示例所示:
  1. using System.Text;
  2. StringBuilder builder = new();
  3. builder.AppendLine("The following arguments are passed:");
  4. foreach (var arg in args)
  5. {
  6.     builder.AppendLine($"Argument={arg}");
  7. }
  8. Console.WriteLine(builder.ToString());
  9. return 0;
复制代码
同时,顶级语句隐式位于全局命名空间Global using中。
4. 命名空间和类型定义
具有顶级语句的文件还可以包含命名空间和类型定义,但它们必须位于顶级语句之后。 例如:
  1. MyClass.TestMethod();
  2. MyNamespace.MyClass.MyMethod();
  3. public class MyClass
  4. {
  5.     public static void TestMethod()
  6.     {
  7.         Console.WriteLine("Hello World!");
  8.     }
  9. }
  10. namespace MyNamespace
  11. {
  12.     class MyClass
  13.     {
  14.         public static void MyMethod()
  15.         {
  16.             Console.WriteLine("Hello World from MyNamespace.MyClass.MyMethod!");
  17.         }
  18.     }
  19. }
复制代码
5. args入参
顶级语句可以引用 args 变量来访问输入的任何命令行参数。 args 变量永远不会为 null,但如果未提供任何命令行参数,则其 Length 将为零。 例如
  1. if (args.Length > 0)
  2. {
  3.     foreach (var arg in args)
  4.     {
  5.         Console.WriteLine($"Argument={arg}");
  6.     }
  7. }
  8. else
  9. {
  10.     Console.WriteLine("No arguments");
  11. }
复制代码
6. await异步调用
调用 await 来执行异步方法。 例如:
  1. Console.Write("Hello ");
  2. await Task.Delay(5000);
  3. Console.WriteLine("World!");
复制代码
7. 隐式入口方法
编译器会生成一个方法,作为具有顶级语句的项目的程序入口点。 方法的签名取决于顶级语句是包含 await 关键字还是 return 语句。
下表显示了方法签名的外观,使用表中的方法名称 Main 来方便起见。
1.png

 
以上,总结分享给大家。
 
周国庆
20220226
 
 
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册