类似于我关于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 "";
}
答案 0 :(得分:13)
答案 1 :(得分:4)
只要没有任何实现IDisposable(或者你周围有using
块),那就应该没问题。
据我所知,这是一种相当普遍和公认的做法,正如Astander在其帖子中提到的那样,foreach
的文件将其视为合法的做法。
答案 2 :(得分:2)
除了从方法中的多个点返回的小代码气味(增加方法的圈复杂度)之外,没有技术理由担心。
答案 3 :(得分:1)
我不知道,但我会做出有根据的猜测:由于枚举器通常不实现IDisposable,因此 应该只是垃圾收集,因为否则每个< / em>使用该枚举器会泄漏非托管资源。当然,从技术上讲,您可以实现一个自身具有副作用的枚举器......
换句话说,我从foreach
区内回来后从未感到难过。我希望语言能够处理事情,就像使用using
语句一样,语言可以确保对象被处理掉(通过隐式调用finally
块中的Dispose)。
答案 4 :(得分:0)
据我记得,枚举一直保持在这个位置,直到下一个foreach循环。然而,这不是问题,因为任何后续foreach将位置返回到枚举的开始。简而言之:它没有任何不良副作用,除非你依赖IEnumerator.Current来获得一个特定的值(无论如何都会很糟糕)。