簡體   English   中英

條件(“調試”)+ #if DEBUG

[英]Conditional(“Debug”) + #if DEBUG

我在調試.net 2.0應用程序中看到了以下代碼

[Conditional("DEBUG")]
void AssertTableExists() {
    #if DEBUG
        ...
    #endif
}

有沒有理由使用#if指令? 我的意思是,根據我的理解,只有在定義了DEBUG時才會調用該方法,所以我沒有看到在方法體中有#if的意義。

巧合的是,我上周碰巧在我的博客上回答了你的問題。

http://ericlippert.com/2009/09/10/whats-the-difference-between-conditional-compilation-and-the-conditional-attribute/

如果方法的主體引用在#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。

  • 使用[Conditional]標記的相同簽名的兩種方法是不可能的,但您可以使用#if實現它。

作為最后一點,我必須說,當您在調試版和發布版中獲得完全不同的行為時,條件編譯有時會玩惡魔游戲,而您只有在部署代碼並且用戶開始抱怨之后才會發現它。 因此,根據經驗,盡量避免使用#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM