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