检测到无法访问的代码(为什么?)
Unreachable Code Detected (Why?)
那么,为什么在这段代码中检测到无法访问的代码:
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) 显然无法访问...为什么?
您的代码有两个代码路径,一个是通过 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;
}
您的代码有一个计算一次的循环,因此第一次迭代将总是 return。
如果那是你想要的,就说吧,
return keys[0].key == key && keys[0].pressed;
但是如果(这是我在这里怀疑的),如果数组中的 any 满足您的测试,您希望 return 为真,然后使用 LINQ 的 Any()
,
return keys.Any(k => k.key == key && k.pressed);
扩展 jdphenix 答案,我认为我们需要了解 为什么 你的循环“ 评估一次" 才明白为什么会有"unreachable code".
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
守卫如果满足 returns true
否则它会执行下一个 else
语句 returns false
。最终结果是,无论 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
是多余的并且可以按照 :
进行简化的问题
那么,为什么在这段代码中检测到无法访问的代码:
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) 显然无法访问...为什么?
您的代码有两个代码路径,一个是通过 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;
}
您的代码有一个计算一次的循环,因此第一次迭代将总是 return。
如果那是你想要的,就说吧,
return keys[0].key == key && keys[0].pressed;
但是如果(这是我在这里怀疑的),如果数组中的 any 满足您的测试,您希望 return 为真,然后使用 LINQ 的 Any()
,
return keys.Any(k => k.key == key && k.pressed);
扩展 jdphenix 答案,我认为我们需要了解 为什么 你的循环“ 评估一次" 才明白为什么会有"unreachable code".
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
守卫如果满足 returns true
否则它会执行下一个 else
语句 returns false
。最终结果是,无论 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
是多余的并且可以按照