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

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

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

对于 .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 方法添加语句一样。 Access args (命令行参数)、 使用 await和 设置退出代码。 甚至可以添加函数。 编译器将其创建为嵌套在生成的入口点方法内的本地函数。 本地函数不能包含任何访问修饰符(例如, public 或 protected)。

顶级语句和 隐式 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文件中。 对于 using 应用程序中所有 .cs 文件中所需的指令,请使用 全局 using 指令。

禁用隐式 using 指令

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

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

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

</Project>

全局 using 指令

全局using指令为整个应用程序(而不是单个文件)导入命名空间。 通过在项目文件中包括项 <Using> 或将该 global using 指令添加到代码文件来添加这些全局指令。

若要删除特定的隐式using指令,请在项目文件中添加具有特定<Using>属性的Remove项。 例如,如果启用using指令隐式功能,则添加以下<ImplicitUsings>enable</ImplicitUsings>项将会删除<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 和 Options、Text Editor、C#、Advanced创建可移植的自定义编辑器设置。