当我在Visual Studio中的C#中尝试使用示例表达式
时public int Test()
{
if (10/2 == 5)
throw new Exception();
return 0;
}
当我保持表达式10/2 == 5时,vs.net会自动发出警告“检测到无法访问的代码”。
如果我改变表达式10/2 == 6,IDE很高兴吗?它是如何发生的?
编辑:对不完整的问题抱歉。即使在编译代码之前,它也会立即发生并发生?
我已经对每个回复进行了投票,并接受了基于FIFO的第一个答案
答案 0 :(得分:9)
if (10/2 == 5)
将始终返回true,这意味着
throw new Exception();
将永远执行,
return 0;
永远不会到达
答案 1 :(得分:4)
如果您反编译此代码,最终会得到:
public int Test()
{
throw new Exception();
}
我相信因为这些是常量值,所以数学是在编译时完成的,所以10/2实际上不是10/2,而是5 ......所以编译器实现5 ==会变得微不足道5总是如此。事实上,我相信这些常量会自动转换为真。编译器的目标是优化总是重复的代码并在编译时运行它的处理,而不是一遍又一遍地运行相同的处理。
所以,基本上,编译器意识到,因为if始终是true
而if导致return
(通过throw
),所以它优化了它的代码知道永远不会被执行。因此,反编译的代码导致上述内容。
事实上,如果你执行10/2 == 6
,则会发生相反的情况,public int Test()
{
int num = 0;
return num;
}
被“限定”为5 == 6,后者变为false。由于if始终为false,因此优化if:
{{1}}
答案 2 :(得分:4)
正如其他人所说,编译器可以评估表达式10 / 2 == 5
编译时,因为它是常量表达式。它的计算结果为true
,因此if
范围之后的任何代码都不可用。如果更改为false
,则<{1}}内的内的代码无法访问。
现在考虑一下这段代码:
if
这两种方法都会生成关于无法访问的代码的警告!
关于C#编译器的一个奇怪的事情是,如果无法访问的代码完全由public int TestA()
{
if (10 / 2 == 5)
return 1;
return 0;
}
public int TestB()
{
if (10 / 2 == 6)
return 1;
return 0;
}
语句组成,那么将发出 no 警告,说明不可修复的问题。
答案 3 :(得分:3)
正在抱怨该行
return 0;
永远无法联系到。 10/2总是等于5.
答案 4 :(得分:2)
在第一种情况下,编译器处理表达式10/2 == 5
,其计算结果为true,因此抛出异常并且return 0
语句无法访问。
在第二种情况下,10/2 == 6
的计算结果为false,因此return 0
语句是可以访问的,因为不会抛出异常。
响应您的编辑:您的代码不必为编译器实际编译,以便知道代码行无法访问。很聪明地知道10/2 == 5
始终为真,无论用户输入是什么,这意味着将始终抛出异常。
答案 5 :(得分:1)
编译器足够智能(这是一个非常简单的检查)并确定永远不会达到返回0。这是因为10/2 == 5将永远为真。根据编译器,以下表达式同等地评估
if (10/2 == 5)
或
if true
编译器能够确定这一点的原因是因为数字不是变量。
答案 6 :(得分:1)
他只是警告说10/2 = = 5以下的整个代码永远不会被解释为10/2总是5。
以同样的方式:
if (true)
{
......
}
else
{
.....
}