#if DEBUG vs if(env.IsDevelopment())

web*_*ake 6 c# debug-symbols asp.net-core

当您希望在调试/开发和发布/生产中具有不同的行为时,似乎可以使用预处理器指令(#if DEBUG)和ASP.NET核心环境名称(IHostingEnvironment.EnvironmentName).什么时候使用一个而不是另一个是有任何理由更喜欢一个而不是另一个

#if DEBUG的示例

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    #if DEBUG
        app.UseDeveloperExceptionPage();
        app.UseBrowserLink();
    #else
        app.UseExceptionHandler("/Error");
    #endif
}
Run Code Online (Sandbox Code Playgroud)

env.IsDevelopment()的示例

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseBrowserLink();
    }
    else
    {
        app.UseExceptionHandler("/Error");
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:这个问题我在寻找什么时候应该使用ASP.NET核心环境名称(.NET核心的新功能).这与关于#if和条件属性的其他问题不同

Pil*_*tal 10

虽然其他答案在 DEBUG 预编译器指令的工作方式方面是正确的,但我认为他们没有抓住问题的重点,即何时使用一种方法而不是另一种方法。

我有一个非常具体的实例,我必须在 #if DEBUG 上使用 IsDevelopment ...

如前所述,#if DEBUG 仅包含调试构建配置的编译代码,灰显且不包含发布配置的代码。

IsDevelopment 方法根本不依赖于构建配置,它依赖于 .NET Core 环境变量,尤其是 Properties 文件夹中 launchSettings.json 中的“environmentVariables”设置

所以你可以利用它来发挥你的优势......在我的例子中,我有一个 web 应用程序,我只想在调试时写入日志文件,并且在 web 服务器上运行时写入本地目录是一个例外,所以我不能使用 #if DEBUG 指令。

但是,如果我将 IHostingEnvironment 依赖注入到我的类的构造函数中并将其设置为本地字段,则我可以测试 _environment.IsDevelopment() 调用并且仅在我从 Visual Studio IDE 运行时执行此代码

我相信这些设置默认位于 launchSettings.json 中:

"profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
Run Code Online (Sandbox Code Playgroud)

因此,换句话说,当您想要进一步区分而不仅仅是处于“调试”配置或环境中,并且想要在从 IDE 运行时专门运行时,请使用 IsDevelopment。


Ron*_*yer 8

预处理程序指令是有条件编译的......

这意味着这样的事情:

#if DEBUG
    //Do something
#endif
Run Code Online (Sandbox Code Playgroud)

只有在DEBUG定义符号时才会编译和检查(它是在构建设置为DEBUG时定义的).此外,在IDE中,预处理程序符号之间的代码将显示为灰色.

这段代码:

if (env.IsDevelopment())
{
    //Do something
}
Run Code Online (Sandbox Code Playgroud)

是为发布/调试环境编译的.这里的关键是代码存在,并且无论环境是调试/发布,测试都会运行.在更复杂的场景中,这有两个影响:

  • 代码的执行可能会更慢
  • 可执行文件会更大

另外,在发布环境中包括调试代码可能会在发布时泄露一些商业机密或其他重要信息.尽可能避免在发布模式下释放调试代码.


Dan*_*ite 0

您可以更改配置环境,并且仅使用IHostingEnvironment. 这是正确构建和测试应用程序的理想方法。

预处理器指令将在编译时更改 IL,这可能会引入一些额外的风险/hiesenbug。