web-dev-qa-db-ja.com

#ifデバッグとif(env.IsDevelopment())

プリプロセッサディレクティブ#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
}

Env.IsDevelopment()の例

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

更新:この質問は、ASP.NETコア環境名(.NETコアの新機能)をいつ使用すべきかを探しています。これは#ifおよび条件付き属性に関する他の質問とは異なります

6
webwake

プリプロセッサディレクティブは条件付きでコンパイルされます...

つまり、次のようなものです。

#if DEBUG
    //Do something
#endif

DEBUGシンボルが定義されている場合にのみコンパイルおよびチェックされます(ビルドがDEBUGに設定されているときに定義されます)。さらに、IDEでは、プリプロセッサシンボル間のコードは灰色で表示されます。

このコード:

if (env.IsDevelopment())
{
    //Do something
}

両方のリリース/デバッグ環境用にコンパイルされています。ここで重要なのは、コードが存在し、デバッグ/リリースされる環境に関係なくテストが実行されることです。より複雑なシナリオでは、これには2つの影響があります。

  • コードの実行が遅くなる可能性があります
  • 実行可能ファイルは大きくなります

さらに、リリース環境にデバッグコードを含めると、リリースされた場合、企業秘密やその他の重要な情報が提供される可能性があります。可能な場合は、リリースモードでデバッグコードをリリースしないようにしてください。

8
Ron Beyer

他の答えはDEBUGプリコンパイラーディレクティブがどのように機能するかについては正しいですが、質問の要点、つまり、どちらの方法を他の方法よりも使用するかが欠けていると思います。

#if DEBUGよりもIsDevelopmentを使用する必要がある非常に具体的なインスタンスがあります...

すでに述べたように、#if DEBUGには、デバッグビルド構成のコードのみがコンパイルに含まれ、グレー表示され、リリース構成のコードは含まれていません。

IsDevelopmentメソッドはビルド構成にまったく依存していません。NETCore環境変数、特に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"}}、

つまり、単に「デバッグ」構成または環境にいるだけでなく、IDEから実行する場合に実行したい場合は、IsDevelopmentを使用します。

5
PillowMetal

たとえば、別のアクションを実行したい場合IHostingEnvironment.EnvironmentNameを使用してチェックを適用することにより、開発、ステージング、および実稼働環境(サーバーの容量または構成の結果である可能性があります)。

'#if DEBUG'メソッドではこれを行うことができません。ステートメントに含めるコードを決定するのはコンパイル時に行われるためです。

1
singleton

IHostingEnvironmentを使用して、構成環境を変更し、アプリケーションを1回だけビルドできます。これは、アプリケーションを正しくビルドしてテストするための理想的な方法です。

プリプロセッサディレクティブは、コンパイル時にILを変更するため、いくつかの追加のリスク/ハイゼンバグが発生する可能性があります。

0
Daniel A. White

_#if DEBUG_を使用すると、非実行ブランチ内のコードはコンパイルされず、アセンブリに含まれませんが、env.IsDevelopment()を使用すると、コードはコンパイルされます。したがって、_#if DEBUG_または_#if WINCE_または_#if !DEBUG_または_#if DOTNET45_または、他の方法ではコンパイルを提供する可能性がある特定のプラットフォーム用にコンパイルおよびビルドするために定義することを選択した他のカスタムカスタムを使用できますエラー。

さらに、Conditional("DEBUG")属性を使用してメソッドを装飾することができ、そのメソッドを呼び出すコードはアセンブリにコンパイルされません。

0
pmcilreavy