我想知道
之间有什么区别#define MYSYMBOL
#if MYSYMBOL
public void foo () {
// ...
}
#endif
和
#define MYSYMBOL
[Conditional("MYSYMBOL")]
public void foo () {
// ...
}
也许这很明显,但如果有人能给我一个正确方向的提示,我会感激不尽:)
答案 0 :(得分:5)
他们是不同的。
使用#if
完全删除所附的代码,因此调用该方法的任何代码都将无法编译,因为该方法已消失。您也可以通过这种方式包装任意数量的代码,而不仅仅是一个完整的方法。
使用[Conditional]
意味着该方法不会在运行时调用,但对它的调用仍将编译(但不会在IL代码中发出调用)。此外,这种方法必须返回void
并且没有任何out
或ref
参数。
答案 1 :(得分:1)
是的,有一个很大的区别:使用#if
指令,根本不编译该方法;它只是在编译的代码中没有。使用Conditional
属性,编译该方法,但是否调用它取决于客户端代码中的符号。如果未在调用代码中定义符号,则删除调用站点,并且不调用该方法。
例如,对于将根据是否定义了DEBUG符号而调用或不调用的库代码,这很有用。一个示例是Debug.Print
方法:只有在使用DEBUG符号编译项目时才会调用它,但无论是否定义了符号,该方法仍然存在于System.dll中。