2

如果我在 Visual Studio 中为我的 C# 项目定义 Debug 常量,我可以确定断言将被评估,并且当它们失败时会显示一个消息框。但是什么标志、属性使 CLR 在运行时实际决定是否评估和显示断言。定义 DEBUG 时,断言代码是否不会在 IL 中结束?还是程序集的 DebuggableAttribute 中的DebuggableAttribute.DebuggingModes标志是关键?如果是这样,它必须存在什么枚举值?这在引擎盖下是如何工作的?

4

2 回答 2

5

如果您在未定义 DEBUG 预处理器符号的情况下进行编译,则对 Debug.Assert 的任何调用都将从编译的代码中省略。

如果您查看Debug.Assert 的文档,您会[ConditionalAttribute("DEBUG")]在声明中看到它。ConditionalAttribute用于决定是否在编译时实际发出方法调用。

如果条件属性意味着未进行调用,则任何参数评估也将被忽略。这是一个例子:

using System;
using System.Diagnostics;

class Test
{
    static void Main()
    {
        Foo(Bar());
    }

    [Conditional("TEST")]
    static void Foo(string x)
    {
        Console.WriteLine("Foo called");
    }

    static string Bar()
    {
        Console.WriteLine("Bar called");
        return "";
    }
}

定义 TEST 时,会调用这两种方法:

c:\Users\Jon> csc Test.cs /d:TEST
c:\Users\Jon> test.exe
Bar called
Foo called

当未定义 TEST 时,也不调用:

c:\Users\Jon> csc Test.cs /d:TEST
c:\Users\Jon> test.exe
于 2009-02-20T16:12:40.373 回答
2

System.Diagnostics.Debug 类和 DEBUG 定义的方法上的 ConditionalAttribute。

于 2009-02-20T16:12:12.747 回答