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

最佳答案

如果在 undefined DEBUG预处理程序符号的情况下进行编译,则对Debug.Assert的所有调用都将从编译后的代码中忽略。

如果查看docs for 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

如果 undefined TEST,则不会调用:
c:\Users\Jon> csc Test.cs /d:TEST
c:\Users\Jon> test.exe

关于.net - 是什么使CLR显示断言?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/570153/

10-13 09:41