27

举个例子:

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

    Debug.Assert(ExpensiveTest());

    //Code...
}

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

4

4 回答 4

37

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

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

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

[ConditionalAttribute("DEBUG")]
public static void Assert(
    bool condition
)

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

于 2012-12-13T09:17:33.457 回答
7

托管代码中的断言 - MSDN

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

也来自同一个链接:

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

于 2012-12-13T09:17:51.360 回答
5

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

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

于 2012-12-13T09:17:19.493 回答
1

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

答案是不。” 来自 Microsoft 支持:如何在 Visual C# 中跟踪和调试

您可以在同一应用程序中单独或一起使用TraceDebug类。在调试解决方案配置项目中,跟踪调试输出都处于活动状态。该项目将这两个类的输出生成到所有Listener 对象。但是,发布解决方案配置项目仅从Trace类生成输出。发布解决方案配置项目忽略任何Debug类方法调用。

特别是,最后一句清楚地表明,Debug.Assert()语句(以及其他 Debug 类方法调用)在 Release 构建中被忽略。

于 2015-08-25T17:46:56.757 回答