Есть ли побочные эффекты возврата изнутри оператора foreach? - PullRequest
13 голосов
/ 04 марта 2010

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

Вот пример:

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

Ответы [ 5 ]

13 голосов
/ 04 марта 2010

Нет, не вижу проблем с этим.

С foreach, в (C # Reference)

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

4 голосов
/ 04 марта 2010

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

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

2 голосов
/ 04 марта 2010

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

1 голос
/ 04 марта 2010

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

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

0 голосов
/ 04 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...