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

时间:2012-06-10 15:13:41

标签: c# debugging c-preprocessor compiler-directives

我想知道

之间有什么区别
#define MYSYMBOL

#if MYSYMBOL
public void foo () {

    // ...
}
#endif

#define MYSYMBOL

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

    // ...
}

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

2 个答案:

答案 0 :(得分:5)

他们是不同的。

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

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

答案 1 :(得分:1)

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

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