条件属性的编译

时间:2019-07-12 22:07:50

标签: c# conditional-statements

我一直在阅读有关条件属性的信息,但是对于编译时发生的事情我仍然有些困惑。说我有以下代码:

[System.Diagnostics.Conditional("FLAG")]
private void DoSomething(string myString)
{
    //  Do Something
}

public void Foo()
{
    DoSomething("With this.");
}

假设未定义FLAG。编译后,DoSomething方法将成为程序集的一部分,还是不存在?假设它确实存在,则对DoSomething的调用将被注释掉(或从程序集中删除),或者它将调用DoSomething方法,以查看它是有条件的且未满足条件,因此立即返回?

显然,跳转到该方法然后不运行就返回比不调用它要花费更多的周期。在大多数情况下,这不是问题,但似乎仍然是一个值得了解的事情。

1 个答案:

答案 0 :(得分:1)

摘自the documentation(重点和遗漏之处):

  

在方法上应用ConditionalAttribute会向编译器表示,除非与{{相关联的条件编译符号,否则该方法的调用不应编译为Microsoft中间语言(MSIL)。 1}}已定义。 如果将此属性应用于不返回void的方法,则会在Visual Studio中出现编译错误。 [...]

如此有效,调用将从生成的二进制文件中消失。

也:

  

编译器仍会检查传递给方法或属性的任何参数。