当前位置:  开发笔记 > 编程语言 > 正文

是什么让CLR显示断言?

如何解决《是什么让CLR显示断言?》经验,为你挑选了1个好方法。

如果我在visual studio中为我的C#项目定义了Debug常量,我可以确定将评估断言并在失败时显示消息框.但是什么标志属性使CLR在运行时实际上决定是否评估和显示断言.在定义DEBUG时,断言代码是否不会在IL中结束?或者它是程序集的DebuggableAttribute中的DebuggableAttribute.DebuggingModes标志的关键点?如果是这样,它的枚举值必须存在?这是如何工作的?



1> Jon Skeet..:

如果在没有定义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

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有