Подобный моему вопросу о возврате из оператора использования (чей ответ обычно был "да, он в порядке") я задаюсь вопросом, столь же ли возврат из foreach оператора лишен побочных эффектов и рассмотрел принятую практику, или когда я делаю это - я оставляющий указатель, зависающий в середине перечисление где-нибудь внутренне и т.д.
Вот пример:
public string GetCurrentTransaction(string idText)
{
foreach (var transaction in transactions)
{
if (idText.IsEquivalentTo(transaction.IdText))
{
return transaction.Content;
}
}
return "";
}
Нет, не вижу в этом проблем.
Из цикла foreach также можно выйти с помощью операторов goto, return или throw.
Я не знаю, но сделаю обоснованное предположение: поскольку перечислитель обычно не реализует IDisposable, он должен быть просто сборщиком мусора, потому что в противном случае каждый использование этого перечислителя приведет к утечке неуправляемых ресурсов. Конечно, технически вы можете реализовать перечислитель, который сам по себе имеет побочные эффекты ...
Другими словами, я никогда не чувствовал себя плохо, возвращаясь из блока foreach
. Я ожидал, что язык будет обрабатывать вещи, как и в случае с оператором using
, где язык обеспечивает удаление объекта (неявным вызовом Dispose в блоке finally
).
Пока ничего там реализует IDisposable (или у вас есть , использующий блок
вокруг него), тогда это должно быть хорошо.
Насколько мне известно, это довольно распространенная и общепринятая практика, и, как упоминает Астандер в своем сообщении, документация для foreach
оправдывает это как законную практику.
За исключением небольшого запаха кода, возвращающегося из нескольких точек в методах (добавляющего цикломатическую сложность методов), нет никаких технических причин для беспокойства.
Насколько я помню, перечисление остается в этой позиции до следующего цикла foreach. Однако это не проблема, так как любой следующий foreach возвращает позицию обратно в начало перечисления. Вкратце: у него нет плохих побочных эффектов, если вы не полагаетесь на IEnumerator.Current, чтобы иметь определенное значение (что в любом случае было бы плохо).