2016-08-26 2 views
0

Итак, почему это, что есть недостижимый код обнаружен в этом коде:Недоступен код Обнаружен (почему?)

 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; 
    } 

Индекс (я), по-видимому недостижим ... почему?

+0

Если ваш 'keys' содержит более 1 ключа, он будет возвращен после первой итерации и никогда не найдет нужный вам ключ. Попробуйте удалить else в вашем цикле for, например. 'for (int i = 0; i

+0

Просто обратите внимание, зачем вам цикл, если вы оцениваете только первое значение? контроль будет возвращен вызывающему абоненту после первой оценки независимо от соответствия ключа. –

ответ

4

Ваш код имеет цикл, который вычисляет один раз, поэтому первая итерация будет всегда возврата.

Если это то, что вы хотите, просто сказать, что,

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

Если же (что я подозреваю, что здесь), вы хотите вернуть истину, если любой в массиве соответствует тест, а затем использовать LINQ-х Any(),

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

святая корова, LINQ красива. Итак ... Просто я знаю, что я здесь делаю. «Любой» ищет элемент «Любой» в списке, который содержит ключ, который я ищу, а также уверен, что он нажат ...? – tdkr80

+0

В принципе - 'enumerable.Any (condition)' истинно, если какие-либо элементы удовлетворяют принятому условию. – jdphenix

0

Ваш код имеет два кода, один - через if, а другой - через else. Это означает, что управление оставит функцию двумя способами. Таким образом, оператор return после else никогда не запускает. Вот почему компилятор указывает на это как недостижимый код. Этого можно избежать, используя следующий код.

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; 
} 
+0

«Позвольте мне добавить некоторые объяснения»; --- почему бы не добавить их сначала, а затем отправить? – zerkms

+0

@zerkms: Я вижу, что эксперты на этом сайте, сначала добавят некоторые ключевые моменты и отредактируют сообщение с полными объяснениями; просто следуя за лидерами. И некоторые люди нанесут удар, чтобы не объяснить, но они не удалят вниз после редактирования, поэтому я добавил эту цитату. –

+1

@zerkms иногда вам нужно начинать сначала, чтобы выиграть гонку :-) –

0

Расширение на 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, иначе он выполняет следующий оператор 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