C#是否在if(false)块内编译代码?

时间:2010-05-06 07:18:24

标签: c# .net

我只是想知道这些代码块是否编译成.dll

我认为这个版本根本没有编译

#if SOMETHING_UNDEFINED
// some code - this is ignored by the compiler
#endif

那么这些呢?

1

if(false) {
  // some code - is this compiled?
}

2

const bool F = false;
if(F) {
  // some code - is this compiled?
}

3

bool F = false;
if(F) {
  // some code - is this compiled?
}
编辑:抱歉,我在谈论Visual Studio

2 个答案:

答案 0 :(得分:7)

只是测试它,Microsoft C#4编译器没有,它看起来像Mono gmcs编译器版本2.4.0.0也没有。我不知道规格中有什么东西禁止它。

编辑:当我回答这个问题时,只有第一个版本存在。案例2相当于案例1,但案例3不是。

答案 1 :(得分:1)

只是答案的附录:

原因是我相信,它只会进行静态检查。在第一种情况下if(false)它会通过简单的模式检查看到那个无法访问的代码,所以它不会编译它(也应该发出警告)。

对于第二种情况,因为F是常量并且它知道它永远不会改变,所以在进行静态检查时它只能进行替换。 [F->假<<身体>>。这将提供与第一个相同的代码。

最后一个很棘手。因为知道100%使用静态检查只有F的值是不可行的。像所有命令式语言一样,C#都有副作用。

想象一下,如果你稍微重写代码

bool F = false; 
foo(ref F);
if(F) { 
  // some code - is this compiled? 
} 

这里的问题是,它不知道foo对F.做什么,为了找出它,它必须跟踪(并可能评估)该函数,现在想象一个非常大的程序,有很多这些模式,毕竟,如果使用了很多语句,那么尝试为所有这些语句找到F的运行时值将非常缓慢且耗时,有时甚至无法实现。