为什么c#编译器会为条件方法留下il代码?

时间:2016-11-03 09:25:19

标签: c# .net compiler-optimization

我有以下计划:

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函数中生成调用指令),因为它会减慢编译速度并增加汇编的大小。

1 个答案:

答案 0 :(得分:5)

该方法在逻辑上仍然存在,并且可以通过反射调用,例如。

C#5规范讨论了被忽略的调用 - 没有关于被省略的实现(第17.4.2节):

  

使用Conditional属性修饰的方法是一种条件方法。 Conditional属性通过测试条件编译符号来指示条件。根据是否在调用点定义了此符号,可以包含或省略对条件方法的调用。如果定义了符号,则包括呼叫;否则,将忽略呼叫(包括接收机的评估和呼叫参数)。

此外,还有其他情况(例如继承,或者如果方法是公开的),它仍然需要存在。简单地总是将方法保存在IL中比在规范中表达所有可以省略的情况简单得多。