簡體   English   中英

Debug.Assert/Debug.Fail 是否自動條件編譯 #if “DEBUG”

[英]Are Debug.Assert/Debug.Fail automatically conditionally compiled #if “DEBUG”

Debug.Assert/Debug.Fail 是否自動有條件地編譯#if "DEBUG"? 或者它更像是如果沒有附加調試器(即使在發布中)它只是沒有做很多事情? 如果是這樣,將它們留在代碼中是否會對性能產生影響? 或者他們真的不打算在生產代碼中,只是測試或條件代碼?

不,如果未定義符號,則整個調用(包括任何表達式評估)都將從編譯中刪除。 這非常重要——如果表達式中有任何副作用,如果沒有定義 DEBUG,它們就不會發生。 這是一個簡短但完整的程序來演示:

using System;
using System.Diagnostics;

class Test
{
    static void Main()
    {
        int i = 0;
        Debug.Assert(i++ < 10);
        Console.WriteLine(i);
    }
}

如果定義了DEBUG ,則打印 1,否則打印 0。

由於這種行為,您不能在條件編譯方法上使用out參數:

using System;
using System.Diagnostics;

class Test
{
    static void Main()
    {
        int i ;
        MethodWithOut(out x);
    }

    [Conditional("FOO")]
    static void MethodWithOut(out int x)
    {
        x = 10;
    }
}

這給出了錯誤:

Test.cs(13,6): error CS0685: Conditional member 'Test.MethodWithOut(out int)' 不能有 out 參數

Debug.Assert/Fail API 包含一個 ConditionalAttribute 屬性,其值為“DEBUG”,如下所示

[Conditional("DEBUG")]
public void Assert(bool condition)

如果在代碼中編譯方法調用時定義了常量 DEBUG,則 C# 和 VB 編譯器實際上只會包含對 is 方法的調用。 如果不存在,則方法調用將從 IL 中省略

是的,差不多。 Debug 方法用 [Conditional("DEBUG")] 屬性修飾,因此如果定義了 DEBUG 符號,則對 Debug 方法的調用不會編譯到 IL 中。

MSDN 上有關ConditionalAttribute的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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