0

我想知道有什么区别

#define MYSYMBOL

#if MYSYMBOL
public void foo () {

    // ...
}
#endif

#define MYSYMBOL

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

    // ...
}

?

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

4

2 回答 2

5

它们不一样。

Using#if完全删除了包含的代码,因此任何调用该方法的代码都不会编译,因为该方法已经消失。你也可以用这种方式包装任意数量的代码,而不仅仅是一个完整的方法。

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

于 2012-06-10T15:19:50.777 回答
1

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

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

于 2012-06-10T15:20:56.233 回答