Использование возврата для выхода из цикла?

Если я пишу цикл for, do или while, можно ли выйти из этого с помощью ключевого слова return?

Например:

class BreakTest 
{
public static void Main() 
{
  for (int i = 1; i <= 100; i++) 
  {
     if (i == 5) 
        **return;**
     Console.WriteLine(i);
    }
   }
}

Я знаю, что return может использоваться для выхода из операторов if, поэтому мне это интересно, поскольку я никогда не пробовал (и не могу получить доступ к своему программному обеспечению, чтобы написать код для проверки этого).

Ответы

Ответ 1

return выйдет из текущего метода (Main в вашем примере). Используйте break для выхода из цикла.

Ответ 2

Вы, безусловно, можете делать то, что вы просите. Кажется, есть 2 лагеря, нужно ли вам или нет. Некоторые говорят, что из функции должна быть только одна точка выхода. Они предполагают, что вы должны использовать переменную флага для записи, которую необходимо закрыть (и, возможно, любые данные, которые вам нужно вернуть), а затем вернуться после того, как вы вышли из цикла или достигли конца ваших деревьев if/else.

Лично у меня нет проблем с несколькими точками выхода из функции, если они симметричны. Что я подразумеваю под "симметричным"? Хорошо, если я собираюсь вернуться изнутри цикла, то я также хочу вернуться в конце цикла (в случае, если я никогда не дойду до условия в цикле, которое заставит меня вернуться раньше). Если я вхожу в сложную иерархию if/else, и я возвращаюсь из одного из случаев, тогда я должен вернуться изнутри всех них.

Вот несколько быстрых примеров того, как я предпочитаю писать свой код:

    public string Search(IEnumerable<string> values)
    {
        foreach(string value in values)
        {
            if(SomeArbitraryCondition())
                return value;
        }

        return null;
    }

    public int PerformAction()
    {
        if (SomeArbitraryCondition())
        {
            if (SomeArbitraryCondition())
            {
                return 1;
            }
            else
            {
                return 2;
            }
        }
        else
        {
            if (SomeArbitraryCondition())
            {
                return 3;
            }
            else
            {
                return 4;
            }
        }
    }

Это не очень жесткое правило, о котором я много думал, но это просто способ, которым я предпочитаю писать его, потому что он кажется мне самым чистым. В некоторых случаях имеет смысл использовать переменную флага и просто возвращать в одном месте.

    public string Search(IEnumerable<string> values)
    {
        string found = null;
        foreach(string value in values)
        {
            if(SomeArbitraryCondition())
                found = value;
        }

        return found;
    }

    public int PerformAction()
    {
        int state;
        if (SomeArbitraryCondition())
        {
            if (SomeArbitraryCondition())
            {
                state = 1;
            }
            else
            {
                state = 2;
            }
        }
        else
        {
            if (SomeArbitraryCondition())
            {
                state = 3;
            }
            else
            {
                state = 4;
            }
        }

        return state;
    }

Ответ 3

Вы можете сделать это. Вызов return; выйдет из Main(). Обычно вы должны использовать break; для выхода из цикла for.

При этом часто считается, что плохая практика имеет несколько точек возврата в пределах одной функции. Многие разработчики предпочитают иметь один оператор return (если метод не объявлен с помощью void). Это может сделать код более простым для понимания, с точки зрения понятности и, следовательно, легче поддерживать и тестировать.

Ответ 4

Имейте это в виду:

  • Вы можете это сделать, но не рекомендуется, потому что оно автоматически выходы из текущего метода выполнения.
  • Не полезно, когда другие инструкции после цикла являются обязательными. имеют значение (из-за этого поведение, указанное в 1-м точка).
  • Может создать эффект пульсации в вашей программе, т.е. попытаться решить одна ошибка/ошибка/ошибка приводит к появлению многих новых. Это позволяет отлаживать бит.

Ответ 5

Ответ просрочен, но return; выйдет из всего вашего метода (так и из вашего цикла), если его тип возврата недействителен. Если это не так, он просто не будет компилироваться, если ваш метод возврата не будет возвращен.