2011-07-04 16 views
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); 
} 

第二:とてもきれい。ロギングが必要な場合は、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); 
} 

私は、パフォーマンスの違いが心配です。 ConditionalAttributeためMSDNページから

答えて

2

: メソッドにConditionalAttributeを適用

は、メソッドへの呼び出しが マイクロソフト中間 言語(MSIL)にをコンパイルすべきではないコンパイラに指示します条件付き ConditionalAttributeに関連付けられた のコンパイルシンボルが定義されている場合を除きます。

したがって、メソッドコールはコンパイル時に削除され、#ifと同じです。

+0

優れています。答えを得ました。 –

0

、コンパイルの設定に応じて、あなたが使用できます。

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

または、

#if DEBUG 
    Logger.Log("Application started !"); 
#endif 
0

ジョージが指摘するように条件付き属性が適用された場合、メソッド呼び出しはコンパイルされません。また、これは手段(#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 9393が出力されます。

+0

ありがとうございます。質問:Will Log(string.Format( "{0}は{1}になりました"、i ++、i));ステートメントはアセンブリでコンパイルされますか? –

+0

'SKIP'が定義されている場合のみ。 –

関連する問題