为什么 Program.cs 不再是一个类?

8pr*_*ons 11 .net c# asp.net program-entry-point .net-core

当您使用最新的 .NET Framework 创建新应用程序时,Program.cs 如下所示:

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();
Run Code Online (Sandbox Code Playgroud)

如果您想知道 - 这实际上是整个文件。不public class Program; 不包括;没有构造函数。回到“那天”,这一切都被包含在Main名为 的类的函数中Program,如下所示:

public class Program
{
    public async static Task Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();

        ...

        await host.RunAsync();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder => 
                webBuilder.UseStartup<Startup>());
}
Run Code Online (Sandbox Code Playgroud)

那么为什么要更改这种没有类定义的脚本样式格式呢Program.cs

Aug*_*ink 9

事实上,这在.NET框架中不会发生。这种新语法是随 .NET 6 和 C# 9 一起发布的。它称为顶级语句,旨在使您能够快速开始编码,而无需包含重复的仪式代码。它不是很有用,这个功能只是简化了开始编码所需的工作。

包含更多详细信息的文档:https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/top-level-statements

  • “排除重复仪式代码的需要。” - 除了所有其他的(复制构造函数、WPF 视图模型等) - 如果您需要自定义它,它还引入了需要将顶级代码重新包装回普通“类”的单调乏味 - 所以我我不相信它可以为任何人节省很多长期或重要项目的时间。 (15认同)
  • @NightOwl888 我认为这种混乱是非常明显的。您拥有在类中编写为面向对象的完整程序,然后您拥有一个每个开发人员都会查看的单一 C# 文件,名为“Program.CS”,它突然看起来像一个脚本。如果你认为这不会让任何人在第一次看到它时产生分散注意力的停顿,无论是经验丰富的还是新手,那么你就忽略了我们的大脑建立并更喜欢一致模式的方式。 (10认同)
  • @Dai“如果你需要定制它”,这几乎是每个项目。我完全同意你的立场,并对这些变化感到困惑。这也会分散你的注意力,因为你希望看到的是课程,而不是剧本。(我知道它实际上不是一个脚本,但闻起来像一个) (5认同)
  • 我不介意是否创建一个新的“Hello world”顶级语句模板。但是更改文档中的每个示例,并删除以前的模板......从 SO 问题的数量来看,它增加了太多的混乱。 (4认同)
  • @Dai 我在主要问题上添加了一个链接,但这似乎是 GitHub 上正在讨论的内容。 (3认同)