顶级语句 - 不使用 Main 方法的程序

0
(0)

从 C# 9 开始,无需在控制台应用程序项目中显式包含 Main 方法。 相反,可以使用顶级语句功能最大程度地减少必须编写的代码。 在这种情况下,编译器将为应用程序生成类和 Main 方法入口点。

下面是一个 Program.cs 文件看,它是 C# 10 中的一个完整 C# 程序:

Console.WriteLine("Hello World!"); 

借助顶级语句,可以为小实用程序(如 Azure Functions 和 GitHub Actions)编写简单的程序。 它们还使初次接触 C# 的程序员能够更轻松地开始学习和编写代码。

以下各节介绍了可对顶级语句执行和不能执行的操作的规则。

仅能有一个顶级文件

一个应用程序只能有一个入口点。 一个项目只能有一个包含顶级语句的文件。 在项目中的多个文件中放置顶级语句会导致以下编译器错误:

CS8802:只有一个编译单元可具有顶级语句。

一个项目可具有任意数量的其他源代码文件,这些文件不包含顶级语句。

没有其他入口点

可以显式编写 Main 方法,但它不能作为入口点。 编译器将发出以下警告:

CS7022:程序的入口点是全局代码;忽略“Main()”入口点。

using 指令

如果包含 using 指令,则它们必须首先出现在文件中,如以下示例中所示:

  using System.Text; StringBuilder builder = new(); builder.AppendLine("Hello"); builder.AppendLine("World!"); Console.WriteLine(builder.ToString()); 

全局命名空间

顶级语句隐式位于全局命名空间中。

命名空间和类型定义

具有顶级语句的文件还可以包含命名空间和类型定义,但它们必须位于顶级语句之后。 例如:

 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; 

隐式入口点方法

编译器会生成一个方法,作为具有顶级语句的项目的程序入口点。 此方法的名称实际上并不是 Main,而是代码无法直接引用的实现细节。 方法的签名取决于顶级语句是包含 await 关键字还是 return 语句。 下表显示了方法签名的外观,为了方便起见,在表中使用了方法名称 Main

C# 语言规范

点击星号评分!

平均分 0 / 5. 投票数: 0

还没有投票!请为他投一票。

评论 抢沙发

评论前必须登录!

 

登录

找回密码

注册