[转]警惕ConditionalAttribute的陷阱

ConditionalAttribute的用法信赖大师都不会陌生,一般用于某个功能只须要在DEBUG(或其他模式)下应用。例如下面的代码将会只在DEBUG景象下输出一些调试信息,其他模式则不会。

        public void Run()
        {
            //do something     
            LogDebugInfo();
        }
        [Conditional("DEBUG")]
        protected void LogDebugInfo()
        {
            //在这里输出一些调试信息
        }

 

在其他模式下,Run办法中的LogDebugInfo()调用将被忽视掉,重视办法体本身还是会被编译,只不过调用它的那段代码不会被编译。以上是一个简单的介绍,接下来讲陷阱。项目中有一个日记功能,在DEBUG模式下是不须要这个功能的,只须要记录临盆景象下的一些数据。是以代码可能是如许:

        [Conditional("RELEASE")]
        public void Log()
        {
            //在这里记录日记
        }

 

对吗?如同是对的,很简单的嘛。其实错了,请大师随便选一个项目,右键查看属性,查看Build标签。DEBUG模式定义了DEBUG和TRACE两个标签

点击查看原图

点击查看原图

而RELEASE设备下并没有默认设备RELEASE标签!是以上方的代码永远不会记录log。之前一向用ConditionalAttribute,传DEBUG标签的,不知不觉想当然了。微软也真是坑爹啊,DEBUG下默认定义DEBUG标签,RELEASE下居然不默认定义RELEASE标签。还好Dflying Chen早早发了然这个BUG,不然真的被坑了。这个教训也提示大师,切切不克不及想当然,要确认之后再下结论。

 

转自:http://www.mysjtu.com/page/M0/S586/586908.html

上一篇‡: [转]C#使用ConditionalAttribute特性来实现代码调试

下一篇‡: vs 2012旗舰版 KEY以及下载地址

最近回复