如果我有一个包含很多if else语句的方法,例如:
public void myMethod()
{
if(..)
else if(..)
else if(...)
else if(...)
else if(...)
//and so on
}
将返回放在这些语句中是否会更快,以便在找到一个语句后检查其余代码是否为true,或者让编译器达到结束时更快?
我想它归结为这样一个问题:return语句是否有效?
编辑:问题的关键点:假设你有一个持续运行的游戏循环,代码包含很多方法和'else ifs'。如果我必须每秒更新2000个不同的对象60次,那么每秒检查120000'否则'(至少)。因此,问题的答案可能会随着时间的推移产生影响。
答案 0 :(得分:18)
没关系。
任何理智或疯狂的编译器都会为任一选项生成相同的字节码。 (假设您编写的代码实际上是等效的)
你应该使用哪种方法更具可读性。
答案 1 :(得分:12)
SLaks的回答当然是正确的。但我认为你问这个问题的事实表明你对if-else意味着什么有误解。当你说
if(x) X();
else if(y) Y();
else if(z) Z();
return;
这意味着与
完全相同if(x)
{
X();
}
else
{
if (y)
{
Y();
}
else
{
if (z)
{
Z();
}
}
}
return;
如果采用分支x
,则永远不会检查y
;控件在return
之后直接跳转到X()
。
事实上,在C#中没有“else if”或者C,C ++,Java或JavaScript。只有“别的”;如果您碰巧在if
之后添加了else
语句,那就是您的业务。除了这个
if (x) X();
else while(y) Y();
是一个“else while”语句。您可以在else
之后添加任何您想要的陈述;大多数人选择放置if
或块语句,但你可以在那里放任何语句。(*)
我理解其他如果'跳过',问题的关键是会添加一个返回使它直接跳出来,而不是花时间跳过它们。例如,在极端情况下,连续一百万个if else语句。它仍然需要找到该行的结尾(这可能需要时间)。我对吗?
好的,我们需要达到更低的水平。 if-else
语句编译如下:
if (condition)
Consequence()
else
Alternative();
Continuation();
实际上转换为一系列goto语句:
if (!condition)
goto ALTERNATIVE;
Consequence();
goto CONTINUATION;
ALTERNATIVE: Alternative();
CONTINUATION: Continuation();
所以,如果你有
if (x) X();
else if (y) Y();
else if (z) Z();
return;
首先成为
if (x)
X();
else
{
if (y)
Y();
else
{
if (z)
Z();
}
}
然后变成
if (!x) goto XALTERNATIVE;
X();
goto CONTINUATION;
XALTERNATIVE: if (!y) goto YALTERNATIVE;
Y();
goto CONTINUATION;
YALTERNATIVE: if (!z) goto CONTINUATION;
Z();
CONTINUATION: return;
这会回答你的问题吗?
(*)除当地声明外; C#禁止这样做。
答案 2 :(得分:0)
当用作条件的保护时它是有效的,但在你的情况下它并不重要,因为一旦其中一个语句被执行,其他语句都没有被验证,但如果你这样做:
if(...){return;}
if(...){return;}
if(...){return;}
if(...){return;}
if(...){return;}
那就重要了。