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
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

在前面的代码中,实际命名空间取决于项目名称。

这两种形式表示相同的程序。 两者在 C# 中均有效。 使用较新版本时,只需编写 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 不使用顶级语句复选框

  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#、高级