省略代码:条件属性和预处理指令之间的任何区别
本文关键字:之间 指令 任何 区别 预处理 代码 条件 属性 | 更新日期: 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
,并且没有任何out
或ref
参数。
是的,有一个很大的区别:使用 #if
指令,该方法根本不编译;它只是在编译的代码中不存在。使用 Conditional
属性,将编译该方法,但是否调用该方法取决于客户端代码中的符号。如果未在调用代码中定义符号,则删除调用站点,并且不调用该方法。
例如,这对于将根据是否定义 DEBUG 符号调用或不调用的库代码非常有用。一个例子是 Debug.Print
方法:仅当您的项目使用 DEBUG 符号编译时,才会调用它,但无论是否定义了该符号.dll该方法仍然存在。