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

:非常整潔。只需要一行代碼即可進行日誌記錄。不知道,是否執行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); 
} 

我關心的性能差異。

回答

2

MSDN頁的ConditionalAttribute

應用ConditionalAttribute到 方法指示的編譯器一個 調用方法不應該是 編譯到Microsoft中間 語言(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

謝謝。問題:將日誌(string.Format(「{0}變成{1}」,i ++,i));聲明在彙編中編譯? –

+0

只有定義了「SKIP」。 –

相關問題