如果我有一个包含很多if else语句的方法,例如:

public void myMethod()
{
    if(..)
    else if(..)
    else if(...)
    else if(...)
    else if(...)

    //and so on            
}

将返回放在这些语句中是否会更快,以便在找到一个语句后检查其余代码是否为真,或者让编译器达到最终括号会更快?

我想这归结为一个问题:return语句是否有效?

编辑:问题的关键点:假设你有一个持续运行的游戏循环,代码包含很多方法和'else ifs'。 如果我必须每秒更新2000个不同的对象60次,那么每秒检查120000'否则'(至少)。 因此,问题的答案可能会随着时间的推移产生影响。

===============>>#1 票数:18 已采纳

没关系。
任何理智或疯狂的编译器都会为任一选项生成相同的字节码。 (假设您编写的代码实际上是等效的)

您应该使用哪种方法更具可读性。

===============>>#2 票数: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 ; 控制在X()之后直接跳转到return

事实上,在C#中没有“else if”或者C,C ++,Java或JavaScript。 只有“别的”; 如果你碰巧在else之后加上if语句,那就是你的事。 除此之外没有“别的”

if (x) X();
else while(y) Y();

是一个“其他时间”的声明。 你可以在else之后放任何你想要的陈述; 大多数人选择输入if或block语句,但你可以在任何你喜欢的语句。(*)

更新:

我明白其他如果'跳过',问题的关键在于会增加一个回报让它直接跳出来,而不是花时间跳过它们。 例如,在极端情况下,连续一百万个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#禁止这样做。

===============>>#3 票数:0

当用作条件的保护时它是有效的,但在你的情况下它并不重要,因为一旦其中一个语句被执行,其他语句都没有被验证,但如果你做了这样的事情:

if(...){return;}
if(...){return;}
if(...){return;}
if(...){return;}
if(...){return;}

那就重要了。

  ask by Colton translate from so

未解决问题?本站智能推荐: