从foreach声明中返回是否有任何副作用?

时间:2010-03-04 12:41:36

标签: c# foreach

类似于我关于returning from inside a using statement的问题(其回答通常是“是的,没关系”)我想知道是否从返回foreach 语句同样没有副作用并且被认为是接受的练习,或者当我这样做时,我将指针悬挂在中间枚举内部某处,等等。

以下是一个例子:

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

5 个答案:

答案 0 :(得分:13)

不,没有看到任何问题。

来自foreach, in (C# Reference)

  

foreach循环也可以退出   goto,return或throwstatements。

答案 1 :(得分:4)

只要没有任何实现IDisposable(或者你周围有using块),那就应该没问题。

据我所知,这是一种相当普遍和公认的做法,正如Astander在其帖子中提到的那样,foreach的文件将其视为合法的做法。

答案 2 :(得分:2)

除了从方法中的多个点返回的小代码气味(增加方法的圈复杂度)之外,没有技术理由担心。

答案 3 :(得分:1)

我不知道,但我会做出有根据的猜测:由于枚举器通常不实现IDisposable,因此 应该只是垃圾收集,因为否则每个< / em>使用该枚举器会泄漏非托管资源。当然,从技术上讲,您可以实现一个自身具有副作用的枚举器......

换句话说,我从foreach区内回来后从未感到难过。我希望语言能够处理事情,就像使用using语句一样,语言可以确保对象被处理掉(通过隐式调用finally块中的Dispose)。

答案 4 :(得分:0)

据我记得,枚举一直保持在这个位置,直到下一个foreach循环。然而,这不是问题,因为任何后续foreach将位置返回到枚举的开始。简而言之:它没有任何不良副作用,除非你依赖IEnumerator.Current来获得一个特定的值(无论如何都会很糟糕)。