1

アプリケーションがデバッグモードで実行されている場合にのみメッセージをログに記録する必要があります。私は2つの方法を見つけました:

最初:ロギングが必要な場合は、どこにでも3行を書き込む必要があります。ただし、Loggerステートメントはコンパイル時にのみ無効になります。これはまさに私が必要としていることです。Logger.Logはまったく実行されません。

#if DEV_ENV
        Logger.Log("Application started !"); // This line is grayed. Perfect !
#endif

public static void Log(string message)
{
    Debug.WriteLine(message);
}

2番目:とてもきれい。ロギングが必要な場合は、1行のコードのみ。Logger.Logステートメントが実行されているかどうかはわかりません。コンパイル時にのみ関数呼び出しが削除される場合(最初のアプローチと同じですが、コード行がグレー表示されていないことを確認してください)、これを使用します。

Logger.Log("Application started !"); // This line is not grayed out. But, function is not called. So, confused whether its removed at compile time.

[Conditional("DEV_ENV")]
public static void Log(string message)
{
    Debug.WriteLine(message);
}

パフォーマンスの違いが気になります。

4

3 に答える 3

2

ConditionalAttributeMSDNページから:

ConditionalAttribute をメソッドに適用すると、ConditionalAttribute に関連付けられている条件付きコンパイル シンボルが定義されていない限り、メソッドの呼び出しを Microsoft Intermediate Language (MSIL) にコンパイルしないことがコンパイラに示されます。

したがって、それが言うように、メソッド呼び出しはコンパイル時に削除されます#if.

于 2011-07-04T08:29:16.803 に答える
0

コンパイル設定に応じて、次を使用できます。

if (System.Diagnostics.Debugger.IsAttached)
   Logger.Log("Application started !"); 

また、

#if DEBUG
    Logger.Log("Application started !"); 
#endif 
于 2011-07-04T08:33:48.180 に答える
0

George が指摘しているように、Conditional 属性が適用されている場合、メソッド呼び出しはコンパイルされません。これはまた、( を使用してコードを直接削除する場合#If DEV_ENVと同様に) メソッド呼び出しに含まれる副作用も発生しないことを意味します。

public static void Main(String[] args)
{
    int i = 92;
    Log(string.Format("{0} became {1}", i++, i));
    Console.WriteLine(i);
    Console.ReadLine();
}

[Conditional("SKIP")]
private static void Log(string msg)
{
    Console.WriteLine(msg);
}

が定義されていない場合SKIP、このコードは を出力し92ます。SKIPが定義されている場合は、92 became 93およびが出力され93ます。

于 2011-07-04T08:40:22.213 に答える