Подтвердить что ты не робот

Есть ли какие-либо побочные эффекты возврата изнутри заявления foreach?

Как и мой вопрос о возвращающемся из инструкции using (чей ответ был вообще " да, это нормально" ) Мне интересно, если возвращение из внутри оператора foreach аналогично лишено побочных эффектов и считается принятой практикой , или когда Я делаю это, я оставляю указатель, висящий посередине перечисление где-то внутри и т.д.

Вот пример:

public string GetCurrentTransaction(string idText)
{
    foreach (var transaction in transactions)
    {
        if (idText.IsEquivalentTo(transaction.IdText))
        {
            return transaction.Content;
        }
    }
    return "";
}
4b9b3361

Ответ 1

Нет, не видишь никаких проблем с этим.

Из foreach, в (ссылка С#)

Цикл foreach также может быть выведен goto, return или throwstatements.

Ответ 2

Пока ничего не реализуется IDisposable (или у вас есть блок using), тогда это должно быть хорошо.

Насколько я знаю, это довольно распространенная и общепринятая практика, и, как отмечает Astander на своем посту, документация для foreach оправдывает ее как законную практику.

Ответ 3

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

Ответ 4

Я не знаю, но я сделаю обоснованное предположение: поскольку перечислитель обычно не реализует IDisposable, он должен быть просто собранным для мусора, потому что в противном случае каждое использование этого перечислителя приведет к утечке неуправляемых ресурсов. Конечно, технически вы можете реализовать перечислитель, который имеет побочные эффекты сам по себе...

Другими словами, я никогда не чувствовал себя плохо в отношении возврата изнутри блока foreach. Я бы ожидал, что язык будет обрабатывать вещи, как с помощью инструкции using, где язык гарантирует, что объект удален (путем неявного вызова Dispose в блоке finally).

Ответ 5

Насколько я помню, перечисление остается на этом месте до следующего цикла foreach. Однако это не проблема, так как любое последующее foreach возвращает позицию обратно в начало перечисления. Короче говоря: у него нет плохих побочных эффектов, если вы не полагаетесь на IEnumerator.Current, чтобы иметь определенное значение (что было бы плохо в любом случае).