我只是想知道这些代码块是否编译成.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
答案 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的运行时值将非常缓慢且耗时,有时甚至无法实现。