首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Conditional(" DEBUG ") + #if DEBUG

Conditional(" DEBUG ") + #if DEBUG
EN

Stack Overflow用户
提问于 2009-09-20 23:42:32
回答 2查看 3.2K关注 0票数 8

在调试.net 2.0应用程序时,我看到了以下代码

代码语言:javascript
运行
复制
[Conditional("DEBUG")]
void AssertTableExists() {
    #if DEBUG
        ...
    #endif
}

有使用#if指令的理由吗?我的意思是,据我所知,只有在定义了DEBUG的情况下才会调用该方法,所以我看不出在方法体中有#if有什么意义。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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指令是必需的。例如

代码语言:javascript
运行
复制
#if DEBUG
static private int testCounter = 1;
#endif

[Conditional("DEBUG")] void CheckConsistency()
{
#if DEBUG
  testCounter++;
#endif
...

如果您在方法体中省略了#if DEBUG,那么它将不会在发布版本中编译。

票数 20
EN

Stack Overflow用户

发布于 2009-09-21 02:42:40

实际上,有很多不同之处。ConditionalAttribute在代码中看起来更干净,但它有很多限制,而且至少比#if有一个优势。

如果symbol不是defined.

  • #if
  • #if会将代码从编译中完全移除--它让你可以更好地控制粒度--你可以将方法中的一行或整个方法或某个类的某些成员括起来,甚至整个class.
  • #if都允许你编写像这样的复杂条件:

#if DEBUG & !NO_NETWORK

  • #if有scenarios.

  • Conditional #else和#elif允许更复杂的scenarios.

  • Conditional只适用于返回void.

  • Conditional的单个完整方法,将代码包含到已编译的程序集中,但会删除对它的所有调用。如果有人引用了您的程序集,他将看到带有条件标记的方法,并且能够使用它们-这是使用#if.

无法实现的

有趣的是,打开带有反射器的.Net框架程序集,找到标记为“DBG”的方法,并查看它们的用法。它们中的任何一个,即使是内部的,都不会在任何地方使用!这是因为微软为发布而编译的.Net没有定义符号"DBG“,但他们实际上是在开发过程中使用这些方法来调试.Net。

使用#if.可以实现

  • 使用Conditional标记具有相同签名的两个方法

作为最后一点,我必须指出,当你在调试和发布版本中得到完全不同的行为时,条件编译有时会玩恶毒的游戏,而且你只有在部署代码后才发现这一点,用户开始抱怨。因此,根据经验,尽量避免使用#if更改行为,只使用它来更改输入数据。

下面是使用#if -不同的应用程序配置调试和发布版本的示例。

代码语言:javascript
运行
复制
static string ConnectionString
{
#if DEBUG
    get { return "<debug connection string>"; }
#else
    get { return "<release connection string>"; }
#endif
}
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1452335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档