.net 什么使CLR显示断言?

.net 什么使CLR显示断言?,.net,debugging,clr,assertions,.net,Debugging,Clr,Assertions,如果我在visualstudio中为我的C#项目定义了Debug常量,我可以确定断言将被评估,并且当它们失败时会显示一个消息框。但是,哪个标志、属性使CLR在运行时实际决定是否计算和显示断言。当定义调试时,断言代码是否不在IL中结束?还是程序集的DebuggableAttribute中的标志是关键点?如果是,它的枚举值必须是什么?这在后台是如何工作的?对System.Diagnostics.Debug类和Debug定义的方法的ConditionalAttribute。如果编译时未定义调试预处理器

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

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

如果编译时未定义调试预处理器符号,则编译代码中将忽略对Debug.Assert的任何调用

如果查看,您将看到它在声明上有
[ConditionalAttribute(“DEBUG”)]
。用于确定是否在编译时实际发出方法调用

如果条件属性表示未进行调用,则任何参数计算也将被忽略。下面是一个例子:

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 "";
    }
}
定义测试时,将调用两种方法:

c:\Users\Jon> csc Test.cs /d:TEST
c:\Users\Jon> test.exe
Bar called
Foo called
未定义测试时,也不调用测试:

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