检测到无法访问的代码(为什么?)

时间:2016-08-26 04:00:40

标签: c# unreachable-code

那么,为什么在此代码中检测到无法访问的代码:

      public bool GetKeyPressed(KeyCode key)
    {
        for (int i = 0; i < keys.Count; i++)
            if (keys[i].key == key && keys[i].pressed)
                return true;
            else
                return false;

        return false;
    }

索引(i)显然无法访问......为什么?

3 个答案:

答案 0 :(得分:4)

您的代码有一个评估一次的循环,因此第一次迭代将始终返回。

如果这就是你想要的,那就说吧,

Python

但是(如果我怀疑这里),如果数组中的任何符合您的测试,则您希望返回true,然后使用LINQ的return keys[0].key == key && keys[0].pressed;

Any()

答案 1 :(得分:0)

您的代码有两个代码路径,一个是pthread_create条件,另一个是if。这意味着控件将以这两种方式离开功能。所以else之后的return语句永远不会触发。这就是编译器将其指向无法访问的代码的原因。使用以下代码可以避免这种情况。

else

答案 2 :(得分:0)

扩展 jdphenix 回答,我认为我们需要了解为什么你的循环&#34; 评估一次&#34;只有这样我们才能理解为什么有&#34;无法访问的代码&#34;

public bool GetKeyPressed(Keys key)
{
    for (int i = 0; i < keys.Count; i++)
        if (keys[i].key == key && keys[i].pressed)
            return true;
        else
            return false;

    return false;
}

for循环有一个构成正文的if-else语句。 if保护如果满意则返回true,否则它将执行返回else的下一个false语句。最终结果是,在将控制权返回给调用方法之前,最多只执行一个循环循环,而不管keys中的项目数。

如果我们通过JetBrains Resharper 查看代码会更加明显:

enter image description here

代码也可以写成:

public bool GetKeyPressed(Keys key)
{
    for (int i = 0; i < keys.Count; ) // Look Ma, no i++  !!!
        if (keys[i].key == key && keys[i].pressed)
            return true;
        else
            return false;

    return false;
}

不要错误地认为方法末尾的最后return false不是必需的,因为它是在keys.Count == 0

的情况下

enter image description here

当然,更好地格式化代码可以很长时间地揭示第一个return false是多余的问题并且可以按照un-lucky's answer进行简化:

enter image description here