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

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

Вот пример:

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

14
задан Community 23 May 2017 в 10:29
поделиться

5 ответов

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

Из foreach в (Справочник C #)

Из цикла foreach также можно выйти с помощью операторов goto, return или throw.

14
ответ дан 1 December 2019 в 12:38
поделиться

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

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

1
ответ дан 1 December 2019 в 12:38
поделиться

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

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

5
ответ дан 1 December 2019 в 12:38
поделиться

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

2
ответ дан 1 December 2019 в 12:38
поделиться

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

0
ответ дан 1 December 2019 в 12:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: