在C#中,Debug.Assert测试是否在发布模式下运行?

Mat*_*att 20 .net c# debugging assert visual-studio

请看以下示例:

public void Foo()
{
    //Code...

    Debug.Assert(ExpensiveTest());

    //Code...
}
Run Code Online (Sandbox Code Playgroud)

Debug.Assert在发布模式下编译时,该方法会发生什么?会ExpensiveTest()继续吗?如果没有,那么它是如何工作的(因为它不是一个可以设置为无评估的宏)?如果它确实运行,那么这是否会破坏调试断言的目的?

Jon*_*eet 30

在发布模式下编译时,Debug.Assert方法会发生什么?

它被完全删除(包括调用ExpensiveTest),假设您没有DEBUG在发布配置中定义的条件编译符号.

如果查看文档,声明使用[ConditionalAttribute("DEBUG")]:

[ConditionalAttribute("DEBUG")]
public static void Assert(
    bool condition
)
Run Code Online (Sandbox Code Playgroud)

ConditionalAttribute用于条件编译.有关详细信息,请参阅Bart de Smet关于条件编译的博客文章,以及C#4规范的第17.4.2节.


Grz*_*lik 5

根据Debug.Assert Method (Boolean) Debug方法仅在调试版本中编译。

因此,如果您构建了正确的发布版本(Debug/Configuration Manager有关详细信息,请参阅菜单项),此方法调用将被删除。


Hab*_*bib 5

托管代码中的断言 - MSDN

在Visual Basic和Visual C#中,您可以使用System.Diagnostics命名空间中的Debug或Trace中的Assert方法. 调试类方法不包含在程序的发行版中,因此它们不会增加大小或降低发布代码的速度.

也来自同一个链接:

请注意,在创建代码的发行版时,对Debug.Assert方法的调用将消失.这意味着检查余额的调用在Release版本中消失.要解决此问题,您应该将Debug.Assert替换为Trace.Assert,它不会在Release版本中消失