Обнаружен недостижимый код (почему?)

Итак, почему в этом коде обнаружен недостижимый код:

      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) явно недоступен... почему?


person Community    schedule 26.08.2016    source источник
comment
Если ваш keys содержит более 1 ключа, он вернется после первой итерации и никогда не найдет нужный ключ внутри. Попробуйте удалить else в цикле for, например. только for (int i = 0; i < keys.Count; i++) if (keys[i].key == key && keys[i].pressed) return true;.   -  person Keyur PATEL    schedule 26.08.2016
comment
Просто примечание: зачем вам цикл, если вы оцениваете только первое значение? управление будет возвращено вызывающей стороне после первой оценки независимо от совпадения ключей.   -  person Hari Prasad    schedule 26.08.2016


Ответы (3)


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

Если это то, чего ты хочешь, просто скажи это,

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

Однако, если (как я подозреваю здесь) вы хотите вернуть true, если любой в массиве соответствует вашему тесту, используйте Any() LINQ,

return keys.Any(k => k.key == key && k.pressed);
person jdphenix    schedule 26.08.2016
comment
святая корова, LINQ прекрасен. Итак... Просто чтобы я знал, что я здесь делаю. «Любой» ищет «Любой» элемент в списке, который содержит ключ, который я ищу, а также проверяет, что он нажат ...? - person ; 26.08.2016
comment
В основном - enumerable.Any(condition) верно, если какие-либо элементы соответствуют переданному условию. - person jdphenix; 26.08.2016

Ваш код имеет два пути кода, один через условие 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;
}
person sujith karivelil    schedule 26.08.2016
comment
позвольте мне добавить некоторые пояснения; --- почему бы не добавить их сначала, а потом публиковать? - person zerkms; 26.08.2016
comment
@zerkms: я вижу, что эксперты на этом сайте сначала добавят некоторые ключевые моменты и отредактируют пост с полными пояснениями; просто следуя за лидерами. И некоторые люди будут ругать за то, что не объяснили, но они не уберут минус после редактирования, поэтому я добавил эту цитату. - person sujith karivelil; 26.08.2016
comment
@zerkms иногда нужно начинать сначала, чтобы выиграть гонку :-) - person Hari Prasad; 26.08.2016
comment
Я, вероятно, выбрал бы этот подход, если бы мне не показали альтернативу LINQ. Но все равно спасибо :). - person ; 26.08.2016

Расширяя ответ 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:

введите здесь описание изображения

Код также может быть записан как:

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 является избыточным и может быть упрощен в соответствии с ответ неудачника:

введите здесь описание изображения

person MickyD    schedule 26.08.2016