C#是否会编译if(false)块中的代码?

13

我只是想知道这些代码块是否会被编译成.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


3
您可以使用反编译工具 Reflector 或 ILDasm 进行简单的检查。 - Ikaso
2
哪个编译器?微软的?Mono?还是其他的? - Greg Hewgill
很抱歉,它是Visual Studio,不同的编译器在完全相同的代码上会做不同的事情吗? - Aximili
2个回答

7

仅进行测试,微软C# 4编译器不支持,Mono gmcs编译器2.4.0.0版本也不支持。虽然我不知道规范中是否有任何禁止它的内容但情况不容乐观。

编辑:当我回答这个问题时,只有第一种情况存在。第二种情况等同于第一种情况,但第三种情况不是。


2
不,最后一个情况被编译成汇编。 - Lasse V. Karlsen
谢谢。我猜常量是否在另一个类甚至另一个项目(在Visual Studio中)中并不重要,对吧? - Aximili
@aximili:我认为它应该是C#编译器认为是常量表达式的任何内容,这可能是来自另一个程序集的const。 - Jon Skeet

1

只是对答案的一个补充:

我认为原因是它只会进行静态检查。在第一种情况下,如果(false),它会通过简单的模式检查看到这是无法到达的代码,因此不会编译它(应该也会给出警告)。

对于第二种情况,因为F是一个常量,并且它知道它永远不会改变,在进行静态检查时,可以进行替换。[F->false]<>。这将得到与第一种情况相同的代码。

最后一种情况有点棘手。仅通过静态检查来确定F的值是否为100%是不可行的。C#像所有命令式语言一样具有副作用。

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接