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

在C#中,是否在发布模式下运行Debug.Assert测试?,c#,.net,visual-studio,debugging,assert,C#,.net,Visual Studio,Debugging,Assert,以以下为例: public void Foo() { //Code... Debug.Assert(ExpensiveTest()); //Code... } 在发布模式下编译时,Debug.Assert方法会发生什么变化?ExpensiveTest()还会运行吗?如果不是,那么它是如何工作的(因为它不是一个可以设置为“无”计算的宏)?如果它确实运行了,那么这不是违背了调试断言的目的吗?根据debug方法只在调试版本中编译 因此,如果您构建了正确的发布版本(有关详细

以以下为例:

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

    Debug.Assert(ExpensiveTest());

    //Code...
}
在发布模式下编译时,
Debug.Assert
方法会发生什么变化?
ExpensiveTest()
还会运行吗?如果不是,那么它是如何工作的(因为它不是一个可以设置为“无”计算的宏)?如果它确实运行了,那么这不是违背了调试断言的目的吗?

根据
debug
方法只在调试版本中编译

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

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

如果您的发行版配置中没有定义
DEBUG
条件编译符号,它将被完全删除(包括调用
ExpensiveTest

如果查看,则声明使用
[ConditionalAttribute(“DEBUG”)]

用于条件编译。有关更多详细信息,请参见C#4规范第17.4.2节。

在Visual Basic和Visual C#中,可以使用 调试或跟踪,位于System.Diagnostics命名空间中。 调试类方法不包括在程序的发布版本中,因此它们不会增加程序的大小或降低程序的速度 你的发布代码

同样来自同一链接:

请注意,创建时,Debug.Assert方法的调用将消失 代码的发布版本。这意味着检查的电话 平衡在发布版本中消失。要解决这个问题,, 您应该将Debug.Assert替换为Trace.Assert,而Trace.Assert不会 在发布版本中消失

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

Microsoft支持部门的回答是“否”:

您可以单独使用跟踪调试类,也可以 在同一应用程序中一起使用。在调试解决方案配置中 项目中,跟踪调试输出都处于活动状态。项目 从这两个类向所有侦听器生成输出 物体。但是,只有发布解决方案配置项目 从跟踪类生成输出。释放解决方案 配置项目忽略任何调试类方法调用

特别是,最后一句话明确指出,
Debug.Assert()
语句(以及其他调试类方法调用)在发布版本中被忽略。

它带有标记,因此只有在调用程序集使用设置的
Debug
符号编译时,调用才会被包含。
[ConditionalAttribute("DEBUG")]
public static void Assert(
    bool condition
)