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