我一直在阅读有关条件属性的信息,但是对于编译时发生的事情我仍然有些困惑。说我有以下代码:
[System.Diagnostics.Conditional("FLAG")]
private void DoSomething(string myString)
{
// Do Something
}
public void Foo()
{
DoSomething("With this.");
}
假设未定义FLAG
。编译后,DoSomething
方法将成为程序集的一部分,还是不存在?假设它确实存在,则对DoSomething
的调用将被注释掉(或从程序集中删除),或者它将调用DoSomething
方法,以查看它是有条件的且未满足条件,因此立即返回?
显然,跳转到该方法然后不运行就返回比不调用它要花费更多的周期。在大多数情况下,这不是问题,但似乎仍然是一个值得了解的事情。
答案 0 :(得分:1)
摘自the documentation(重点和遗漏之处):
在方法上应用
ConditionalAttribute
会向编译器表示,除非与{{相关联的条件编译符号,否则该方法的调用不应编译为Microsoft中间语言(MSIL)。 1}}已定义。 如果将此属性应用于不返回void的方法,则会在Visual Studio中出现编译错误。 [...]
如此有效,调用将从生成的二进制文件中消失。
也:
编译器仍会检查传递给方法或属性的任何参数。