我有以下计划:
public class TestClass
{
[Conditional("DEBUG")]
static void debug_foo()
{
Console.WriteLine("DEBUG foo");
}
static int Main(System.String[] args)
{
debug_foo();
return 0;
}
}
我使用发布模式编译程序。我在程序集中找到了debug_foo方法的il代码。我无法理解这种解决方案的原因。我认为如果c#编译器可以理解,那个方法没有使用,那么编译器根本不需要生成il代码(例如,它不会在main函数中生成调用指令),因为它会减慢编译速度并增加汇编的大小。
答案 0 :(得分:5)
该方法在逻辑上仍然存在,并且可以通过反射调用,例如。
C#5规范仅讨论了被忽略的调用 - 没有关于被省略的实现(第17.4.2节):
使用
Conditional
属性修饰的方法是一种条件方法。Conditional
属性通过测试条件编译符号来指示条件。根据是否在调用点定义了此符号,可以包含或省略对条件方法的调用。如果定义了符号,则包括呼叫;否则,将忽略呼叫(包括接收机的评估和呼叫参数)。
此外,还有其他情况(例如继承,或者如果方法是公开的),它仍然需要存在。简单地总是将方法保存在IL中比在规范中表达所有可以省略的情况简单得多。