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
或一个块语句,但你可以放任何你喜欢的语句。(*)
更新:
我知道 else if 'skips',问题的关键是添加一个 return 让它直接跳出来,而不是花时间首先跳过它们。例如,在极端情况下,连续一百万个 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# 禁止这样做。