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

本文关键字:之间 指令 任何 区别 预处理 代码 条件 属性 | 更新日期: 2023-09-27 18:36:39

我想知道两者之间有什么区别

#define MYSYMBOL
#if MYSYMBOL
public void foo () {
    // ...
}
#endif

#define MYSYMBOL
[Conditional("MYSYMBOL")]
public void foo () {
    // ...
}

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

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

它们是不同的。

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

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

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

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