![](/img/trans.png)
[英]Should Debug.Assert and Debug.Fail be used liberally, and should they be left in production code?
[英]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.