C# 控制台应用模板可生成顶级语句

从 .NET 6 开始,新 C# 控制台应用的项目模板在 Program.cs 文件中生成以下代码:

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

新的输出使用最新的 C# 功能,这些功能简化了需要为程序编写的代码。 对于 .NET 5 及更早版本,控制台应用模板生成以下代码:

using System;

namespace MyApp // Note: actual namespace depends on the project name.
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

这两种形式代表同一个程序。 两者都适用于 C# 10.0。 使用较新版本时,只需编写 Main 方法的主体。 编译器会生成一个具有入口点方法的 Program 类,并将你的所有顶级语句置于该方法中。 生成的方法的名称不是 Main,它是你的代码无法直接引用的实现细节。 不需要包含其他程序元素,编译器会为你生成这些元素。 你可以在 C# 指南的基础部分中,在关于顶级语句的文章中详细了解使用顶级语句时编译器生成的代码。

对于尚未更新为使用 .NET 6+ 模板的教程,可以使用以下两个选项:

  • 使用新的程序样式,添加功能时添加新的顶级语句。
  • 使用 Program 类和 Main 方法将新程序样式转换为旧样式。

如果要使用旧模板,请参阅本文后面的使用旧程序样式

使用新的程序样式

使新程序更简单的功能是顶级语句、全局 using 指令和隐式 using 指令 。

术语顶级语句是指编译器会为主程序生成类和方法元素。 编译器生成的类和入口点方法在全局命名空间中声明。 你可以查看新应用程序的代码,并假设它包含早期模板所生成的 Main 方法内的语句,但位于全局命名空间中。

你可以向程序添加更多语句,就像用传统方式将更多语句添加到 Main 方法一样。 可以访问 args(命令行参数)使用 await设置退出代码。 甚至可以添加函数。 它们被创建为嵌套在生成的入口点方法中的本地函数。 本地函数不能包括任何访问修饰符(例如 publicprotected)。

顶级语句和隐式 using 指令都简化了构成应用程序的代码。 若要按照现有教程操作,请将所有新语句添加到模板生成的 Program.cs 文件中。 假设在本教程的说明中,你编写的语句位于 Main 方法中的左大括号和右大括号之间。

如果你更喜欢使用较旧的格式,则可以复制本文第二个示例中的代码,并像以前一样继续学习本教程。

有关顶级语句的详细信息,请参阅有关顶级语句的教程。

隐式 using 指令

术语“隐式 using 指令”是指编译器会根据项目类型自动添加一组 using 指令。 对于控制台应用程序,以下指令隐式包含在应用程序中:

  • using System;
  • using System.IO;
  • using System.Collections.Generic;
  • using System.Linq;
  • using System.Net.Http;
  • using System.Threading;
  • using System.Threading.Tasks;

其他应用程序类型包括更多对这些应用程序类型通用的命名空间。

如果需要未隐式包含的 using 指令,可以将这些指令添加到包含顶级语句的 .cs 文件或其他 .cs 文件中。 对于应用程序的所有 .cs 文件中所需的 using 指令,请使用全局 using 指令

禁用隐式 using 指令

如果想删除此行为并手动控制项目中的所有命名空间,请将 <ImplicitUsings>disable</ImplicitUsings> 添加到项目文件的 <PropertyGroup> 元素中,如以下示例所示:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    ...
    <ImplicitUsings>disable</ImplicitUsings>
  </PropertyGroup>

</Project>

全局 using 指令

全局 using 指令导入整个应用程序的命名空间,而不是单个文件。 可以通过向项目文件添加 <Using> 项或将 global using 指令添加到代码文件来添加这些全局指令。

还可以在项目文件中添加一个具有 Remove 属性的 <Using> 项,以删除特定的隐式 using 指令。 例如,如果通过 <ImplicitUsings>enable</ImplicitUsings> 启用隐式 using 指令功能,则添加以下 <Using> 项会从隐式导入的命名空间中删除 System.Net.Http 命名空间:

<ItemGroup>
  <Using Remove="System.Net.Http" />
</ItemGroup>

使用旧程序样式

从 .NET SDK 6.0.300 开始,console 模板具有选项 --use-program-main。 请使用它来创建不使用顶级语句且具有 Main 方法的控制台项目。

dotnet new console --use-program-main

生成的 Program.cs 如下所示:

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

在 Visual Studio 中使用旧程序样式

  1. 创建新项目时,设置步骤将导航到“其他信息”设置页。 在此页上,选择“不要使用顶级语句”复选框。

    Visual Studio do not use top-level statements check box

  2. 创建项目后,Program.cs 内容如下所示:

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

注意

Visual Studio 会在下次基于同一模板创建项目时保留选项的值,因此默认情况下,在下次创建控制台应用项目时,将回选中“不要使用顶级语句”复选框。 Program.cs 文件的内容可能会有所不同,以匹配全局 Visual Studio 文本编辑器设置或 EditorConfig 文件中定义的代码样式。

有关详细信息,请参阅使用 EditorConfig 创建可移植的自定义编辑器设置选项、文本编辑器、C#、高级