【问题标题】:Omitting code: Any difference between Conditional Attribute and pre-processing directive?省略代码:条件属性和预处理指令之间有什么区别?
【发布时间】:2012-06-10 15:13:41
【问题描述】:

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

#define MYSYMBOL

#if MYSYMBOL
public void foo () {

    // ...
}
#endif

#define MYSYMBOL

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

    // ...
}

?

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

【问题讨论】:

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


    【解决方案1】:

    它们是不同的。

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

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

    【讨论】:

    • “对它的调用仍然会编译”:严格来说这不是真的,因为调用站点在编译时被删除了......但我明白你的意思;)
    • @ThomasLevesque 谢谢 - 我已经澄清了一点:)
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 2022-03-07
      相关资源
      最近更新 更多