顶级语句 - 不使用 Main 方法的程序 - C# | Microsoft Learn icon-default.png?t=N7T8 https://learn.microsoft.com/zh-cn/dotnet/csharp/fundamentals/program-structure/top-level-statements 无需在控制台应用程序项目中显式包含 Main 方法。 相反,可以使用顶级语句功能最大程度地减少必须编写的代码。 在这种情况下,编译器将为应用程序生成类和 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("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 变量永远不会为 null,但如果未提供任何命令行参数,则其 Length 将为零。 例如:

if (args.Length > 0)
    foreach (var arg in args)
        Console.WriteLine($"Argument={arg}");
    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

顶级代码包含隐式 Main 签名
await 和 returnstatic async Task<int> Main(string[] args)
awaitstatic async Task Main(string[] args)
returnstatic int Main(string[] args)
否 await 或 returnstatic void Main(string[] args)

C# 语言规范

有关详细信息,请参阅 C# 语言规范。 该语言规范是 C# 语法和用法的权威资料。

C# 9 开始,无需在控制台应用程序项目中显式包含 方法。 相反,可以使用顶级语句功能最大程度地减少必须编写的代码。 在这种情况下,编译器将为应用程序生成类和 方法入口点。下面是一个 Program.cs 文件看,它是 C# 10 中的一个完整 C# 程序: 注意点:参考:Microsoft C# 顶级语句...
顶级语句 (Top-level statements) 顶级语句这个名字看起来是那么直观,或许它的曾用名更好一些:Simple Programs,简单程序。 想必大家都知道,即使是最简单的 C# 程序,也会有一定量的繁文缛节,因为最少也需要一个 Main 方法。这似乎妨碍了语言的学习和程序的清晰度。因此,这个特性的最主要目的就是为了初学者和代码的清晰度,让书写 C# 程序可以变得更轻松。 语法 Spec 如下,允许在命名空间的声明前面,添加一组语句,且只允许有一个编译单元(可以认为是一个源文件
CS7022 C# 程序的入口点是全局代码;将忽略“Program.Main(string[])”入口点。 在顶部加入Namespace.Program.Main(new string[] { "" }); 或尝试寻找在入口点外的执行代码
C#是一种面向对象的编程语言,由微软公司开发。它是一种通用的、静态类型的编程语言,广泛应用于Windows平台上的应用程序开发。 关于使用TopLevel,TopLevel是C# 9.0中引入的一个新特性,它允许我们在C#控制台应用程序中编写顶级语句,而无需显式定义一个入口点(Main方法)。这样可以简化我们的代码结构,使得我们可以更加直观地编写和代码。 下面是使用TopLevel的示例代码: ```csharp using System; Console.WriteLine("Hello, World!"); 在上面的示例中,我们直接在顶级位置使用了`Console.WriteLine`语句,而无需定义一个入口点。当我们运行这段代码时,它会直接输出"Hello, World!"。 使用TopLevel时,我们需要注意以下几点: 1. 我们需要使用`using`关键字引入所需的命名空间。 2. 我们可以在顶级位置直接编写语句,但能定义类、方法等结构。 3. 如果我们需要定义类、方法等结构,仍然需要在顶级位置之外进行。 希望以上内容对您有帮助!