请看以下例子:
public void Foo()
{
//Code...
Debug.Assert(ExpensiveTest());
//Code...
}
当我在发布模式下编译时,Debug.Assert
方法会发生什么?ExpensiveTest()
仍然会运行吗?如果不运行,那么它是如何工作的(因为它不是可以设置为评估为无效的宏)?如果它确实运行,那么这不是违背了调试断言的目的吗?
请看以下例子:
public void Foo()
{
//Code...
Debug.Assert(ExpensiveTest());
//Code...
}
当我在发布模式下编译时,Debug.Assert
方法会发生什么?ExpensiveTest()
仍然会运行吗?如果不运行,那么它是如何工作的(因为它不是可以设置为评估为无效的宏)?如果它确实运行,那么这不是违背了调试断言的目的吗?
在发布模式下编译时,Debug.Assert方法会被完全删除(包括调用ExpensiveTest),假设你的发布配置中未定义DEBUG条件编译符号。
如果您查看文档,可以看到声明使用的是[ConditionalAttribute("DEBUG")]
:
[ConditionalAttribute("DEBUG")]
public static void Assert(
bool condition
)
ConditionalAttribute
用于条件编译。有关详细信息,请参阅 Bart de Smet 在条件编译方面的博客文章,以及 C# 4 规范的第17.4.2节。
在Visual Basic和Visual C#中,您可以使用位于System.Diagnostics命名空间中的Debug或Trace中的Assert方法。 调试类方法不包含在程序的发布版本中,因此它们不会增加发布代码的大小或降低速度。
同样来自于同一链接:
请注意,当您创建一个发布版本代码时,对Debug.Assert方法的调用将消失。这意味着在发布版本中不会检查余额的调用将消失。要解决此问题,您应该将Debug.Assert替换为不会消失的Trace.Assert。
Debug
方法只在调试版本中编译。Debug/Configuration Manager
),则此方法调用将被删除。
DEBUG
符号时,该调用才会被包含。 - CodesInChaos