省略代码:条件属性和预处理指令之间有啥区别?
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
,并且没有任何out
或ref
参数。
【讨论】:
“对它的调用仍然会编译”:严格来说这不是真的,因为调用站点在编译时被删除了......但我明白你的意思;) @ThomasLevesque 谢谢 - 我已经澄清了一点:)【参考方案2】:是的,有一个很大的不同:使用#if
指令,方法根本不被编译;它只是不存在于编译的代码中。使用Conditional
属性,编译该方法,但是否调用它取决于客户端代码中的符号。如果调用代码中没有定义符号,则删除调用点,不调用方法。
这很有用,例如,对于将根据是否定义 DEBUG 符号来调用的库代码。一个例子是 Debug.Print
方法:只有当你的项目使用 DEBUG 符号编译时才会调用它,但无论符号是否定义,该方法仍然存在于 System.dll 中。
【讨论】:
以上是关于省略代码:条件属性和预处理指令之间有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
ADD 和 COPY Dockerfile 指令有啥区别? [复制]
TouchEvent.Touch 和 MouseEvent.Click 之间有啥技术或处理上的区别吗?