省略代码:条件属性和预处理指令之间有啥区别?

Posted

技术标签:

【中文标题】省略代码:条件属性和预处理指令之间有啥区别?【英文标题】:Omitting code: Any difference between Conditional Attribute and pre-processing directive?省略代码:条件属性和预处理指令之间有什么区别? 【发布时间】:2012-06-10 15:13:41 【问题描述】:

我想知道两者之间有什么区别

#define MYSYMBOL

#if MYSYMBOL
public void foo () 

    // ...

#endif

#define MYSYMBOL

[Conditional("MYSYMBOL")]
public void foo () 

    // ...

?

也许这很明显,但如果有人能给我一个正确方向的提示,我将不胜感激:)

【问题讨论】:

【参考方案1】:

它们是不同的。

使用#if 会完全删除封闭的代码,因此任何调用该方法的代码都不会编译,因为该方法已消失。您还可以通过这种方式包装任意数量的代码,而不仅仅是一个完整的方法。

使用[Conditional] 意味着该方法不会在运行时被调用,但对它的调用仍会编译(但调用不会在 IL 代码中发出)。同样,这样,该方法必须返回void,并且没有任何outref 参数。

【讨论】:

“对它的调用仍然会编译”:严格来说这不是真的,因为调用站点在编译时被删除了......但我明白你的意思;) @ThomasLevesque 谢谢 - 我已经澄清了一点:)【参考方案2】:

是的,有一个很大的不同:使用#if 指令,方法根本不被编译;它只是不存在于编译的代码中。使用Conditional 属性,编译该方法,但是否调用它取决于客户端代码中的符号。如果调用代码中没有定义符号,则删除调用点,不调用方法。

这很有用,例如,对于将根据是否定义 DEBUG 符号来调用的库代码。一个例子是 Debug.Print 方法:只有当你的项目使用 DEBUG 符号编译时才会调用它,但无论符号是否定义,该方法仍然存在于 System.dll 中。

【讨论】:

以上是关于省略代码:条件属性和预处理指令之间有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

ARM指令和THUMB指令有啥区别

C ++中的宏指令和预处理器指令有啥区别[重复]

ADD 和 COPY Dockerfile 指令有啥区别? [复制]

TouchEvent.Touch 和 MouseEvent.Click 之间有啥技术或处理上的区别吗?

stm32的arm内核和cortex架构到底是啥意思?有啥区别?求指教!

预处理指令