在调试.net 2.0应用程序时,我看到了以下代码
[Conditional("DEBUG")]
void AssertTableExists() {
#if DEBUG
...
#endif
}有使用#if指令的理由吗?我的意思是,据我所知,只有在定义了DEBUG的情况下才会调用该方法,所以我看不出在方法体中有#if有什么意义。
发布于 2009-09-21 00:02:54
巧合的是,上周我恰好在我的博客上回答了你的问题。
http://ericlippert.com/2009/09/10/whats-the-difference-between-conditional-compilation-and-the-conditional-attribute/
如果方法体引用了在#if DEBUG指令下声明的实体,则#if指令是必需的。例如
#if DEBUG
static private int testCounter = 1;
#endif
[Conditional("DEBUG")] void CheckConsistency()
{
#if DEBUG
testCounter++;
#endif
...如果您在方法体中省略了#if DEBUG,那么它将不会在发布版本中编译。
发布于 2009-09-21 02:42:40
实际上,有很多不同之处。ConditionalAttribute在代码中看起来更干净,但它有很多限制,而且至少比#if有一个优势。
如果symbol不是defined.
#if DEBUG & !NO_NETWORK
无法实现的
有趣的是,打开带有反射器的.Net框架程序集,找到标记为“DBG”的方法,并查看它们的用法。它们中的任何一个,即使是内部的,都不会在任何地方使用!这是因为微软为发布而编译的.Net没有定义符号"DBG“,但他们实际上是在开发过程中使用这些方法来调试.Net。
使用#if.可以实现
作为最后一点,我必须指出,当你在调试和发布版本中得到完全不同的行为时,条件编译有时会玩恶毒的游戏,而且你只有在部署代码后才发现这一点,用户开始抱怨。因此,根据经验,尽量避免使用#if更改行为,只使用它来更改输入数据。
下面是使用#if -不同的应用程序配置调试和发布版本的示例。
static string ConnectionString
{
#if DEBUG
get { return "<debug connection string>"; }
#else
get { return "<release connection string>"; }
#endif
}https://stackoverflow.com/questions/1452335
复制相似问题