.net顶级语句省略main方法

内容复制自:https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/tutorials/top-level-statements

先决条件

需要将计算机设置为运行 .NET 6,其中包括 C# 10 编译器。 自 Visual Studio 2022.NET 6 SDK 起,开始提供 C# 10 编译器。

本教程假设你熟悉 C# 和 .NET,包括 Visual Studio 或 .NET CLI。

 

开始探索

借助顶级语句,你可以将程序的入口点置于类的静态方法中,以避免额外的工作。 新控制台应用程序的典型起点类似于以下代码:

using System;

namespace Application
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

上面的代码是运行 dotnet new console 命令并创建新控制台应用程序的结果。 这 11 行只包含一行可执行代码。

可以通过新的顶级语句功能简化该程序。 由此,你可以删除此程序中除两行以外的所有行:

// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

备注

重要

适用于 .NET 6 的 C# 模板使用顶级语句。 如果你已升级到 .NET 6 预览版,则应用程序可能与本文中的代码不匹配。 有关详细信息,请参阅有关新 C# 模板生成顶级语句的文章

.NET 6 SDK 还为使用以下 SDK 的项目添加了一组隐式 指令:

    Microsoft.NET.Sdk
    Microsoft.NET.Sdk.Web
    Microsoft.NET.Sdk.Worker

这些隐式 global using 指令包含项目类型最常见的命名空间。

 

此功能简化了开始探索新想法所需的操作。 你可以将顶级语句用于脚本编写场景,或用于探索。

掌握基础知识后,便可以开始重构代码,并为生成的可重用组件创建方法、类或其他程序集。 顶级语句支持快速试验和初学者教程。 它们还提供一条从试验到完整程序的平滑路径。

顶级语句按照其在文件中出现的顺序执行。 顶级语句只能用在应用程序的一个源文件中。 如果将其用于多个文件,编译器将生成错误。

 

 

摘要

使用顶级语句,可以更轻松地创建简单的程序来探索新的算法。 可以尝试使用不同的代码片段来试验算法。 了解了哪些可用后,可以重构代码,使其更易于维护。

顶级语句可简化基于控制台应用程序的程序。 其中包括 Azure Functions、GitHub 操作和其他小实用工具。 有关详细信息,请参阅顶级语句(C# 编程指南)

 

--------------------------------------------------------

内容来源:https://docs.microsoft.com/zh-cn/dotnet/csharp/fundamentals/program-structure/top-level-statements

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

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

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

Console.WriteLine("Hello World!");

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

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

仅能有一个顶级文件

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

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

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

没有其他入口点

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

CS7022:程序的入口点是全局代码;忽略“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 变量来访问输入的任何命令行参数。 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

顶级代码包含隐式 Main 签名
awaitreturn static async Task<int> Main(string[] args)
await static async Task Main(string[] args)
return static int Main(string[] args)
awaitreturn static void Main(string[] args)

 

 

C# 语言规范

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

功能规范 - 顶级语句

 
个人建议:

建议去阅读功能规范:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-9.0/top-level-statements

微软官网给的设计该功能的动机

There's a certain amount of boilerplate surrounding even the simplest of programs, because of the need for an explicit Main method. This seems to get in the way of language learning and program clarity. The primary goal of the feature therefore is to allow C# programs without unnecessary boilerplate around them, for the sake of learners and the clarity of code.

由于需要显式的Main方法,即使是最简单的程序也有一定数量的样板文件。这似乎妨碍了语言学习和程序清晰度。因此,这个特性的主要目的是为了让c#程序没有不必要的样板,既有利于学习者,又便于代码的清晰。

 

posted on 2022-03-22 10:35  荆棘人  阅读(2242)  评论(0编辑  收藏  举报

导航