【问题标题】:Unreachable Code Detected (Why?)检测到无法访问的代码(为什么?)
【发布时间】:2017-01-02 15:24:06
【问题描述】:

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

      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) 显然无法访问...为什么?

【问题讨论】:

  • 如果您的keys 包含多个密钥,它将在第一次迭代后返回,并且永远不会在其中找到您想要的密钥。尝试删除 for 循环中的 else,例如仅限for (int i = 0; i &lt; keys.Count; i++) if (keys[i].key == key &amp;&amp; keys[i].pressed) return true;
  • 请注意,如果您只评估第一个值,为什么需要循环?在第一次评估后,无论键匹配如何,控制权都会返回给调用者。

标签: c# unreachable-code


【解决方案1】:

您的代码有一个计算一次的循环,因此第一次迭代将总是返回。

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

return keys[0].key == key && keys[0].pressed;

但是,如果(我在这里怀疑),如果数组中的 any 符合您的测试,您想要返回 true,然后使用 LINQ 的 Any()

return keys.Any(k => k.key == key && k.pressed);

【讨论】:

  • 天哪,LINQ 很漂亮。所以...只是让我知道我在这里做什么。 'Any' 正在列表中搜索 'Any' 项目,其中包含我正在搜索的键,并确保它被按下...?
  • 基本上 - 如果任何元素满足传入的条件,enumerable.Any(condition) 为真。
【解决方案2】:

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

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

【讨论】:

  • "让我补充一些解释;" --- 为什么不先添加然后发布?
  • @zerkms :我看到这个网站的专家,最初会添加一些关键点,并编辑带有完整解释的帖子;只是跟着领导。有些人会因为不解释而遭到抨击,但他们不会在编辑后删除down,这就是我添加这句话的原因。
  • @zerkms 有时你必须先开始做才能赢得比赛:-)
  • 如果我没有看到 LINQ 替代方案,我可能会采用这种方法。不过还是谢谢你:)。
【解决方案3】:

扩展 jdphenix 答案,我认为我们需要了解为什么您的循环“评估一次”,然后我们才能理解为什么会有是“无法访问的代码”

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,否则它执行下一个返回falseelse 语句。最终结果是,无论keys 中的项目数如何,在将控制权返回给调用方法之前最多会执行一个循环循环。

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

代码也可以写成:

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 的场景中

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

【讨论】:

    猜你喜欢
    • 2011-05-09
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 2014-05-22
    • 1970-01-01
    相关资源
    最近更新 更多