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,不然真的被坑了。这个教训也提醒大家,千万不能想当然,要确认之后再下结论。

  

作者: 水牛刀刀 发表于 2011-08-24 11:35 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架
新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"