[英]Conditional(“Debug”) + #if DEBUG
我在調試.net 2.0應用程序中看到了以下代碼
[Conditional("DEBUG")]
void AssertTableExists() {
#if DEBUG
...
#endif
}
有沒有理由使用#if指令? 我的意思是,根據我的理解,只有在定義了DEBUG時才會調用該方法,所以我沒有看到在方法體中有#if的意義。
巧合的是,我上周碰巧在我的博客上回答了你的問題。
如果方法的主體引用在#if DEBUG指令下聲明的實體,則必須使用#if指令。 例如
#if DEBUG
static private int testCounter = 1;
#endif
[Conditional("DEBUG")] void CheckConsistency()
{
#if DEBUG
testCounter++;
#endif
...
如果在方法體中省略了#if DEBUG,則無法在發布版本中編譯。
實際上有很多不同之處。 ConditionalAttribute在代碼中看起來更干凈,但它有很多限制,至少比#if有一個優勢。
如果未定義符號, #if將完全從編譯中刪除代碼。
#if使您可以更好地控制粒度 - 您可以在方法或整個方法中包含一行或者甚至是整個類的某些成員。
#if允許您編寫如下復雜條件:
#if DEBUG & !NO_NETWORK
#if有#else和#elif允許更復雜的場景。
[有條件]僅適用於返回void的單個整體方法。
[有條件]包括編譯匯編代碼但刪除對它的所有調用。 如果有人引用你的程序集,他會看到標有[條件]的方法並且能夠使用它們 - 這是你用#if無法實現的。
用反射器打開.Net Framework程序集很有意思,查找標記為Conditional [“DBG”]的方法並查看它們的用法。 他們都沒有,甚至是內部的,都在任何地方使用! 那是因為微軟編譯了.Net,沒有定義符號“DBG”,但實際上他們在開發過程中使用這些方法來調試.Net。
作為最后一點,我必須說,當您在調試版和發布版中獲得完全不同的行為時,條件編譯有時會玩惡魔游戲,而您只有在部署代碼並且用戶開始抱怨之后才會發現它。 因此,根據經驗,盡量避免使用#if更改行為,僅使用它來更改輸入數據。
以下是使用#if的示例 - 用於調試和發布版本的不同應用程序配置。
static string ConnectionString
{
#if DEBUG
get { return "<debug connection string>"; }
#else
get { return "<release connection string>"; }
#endif
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.