Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从foreach语句内部返回是否有任何副作用?_C#_Foreach - Fatal编程技术网

C# 从foreach语句内部返回是否有任何副作用?

C# 从foreach语句内部返回是否有任何副作用?,c#,foreach,C#,Foreach,类似于我的问题(其答案通常是“是的,没关系””),我想知道从foreach声明中返回是否同样没有副作用,并且被认为是公认的做法,或者当我这样做的时候,我会留下一个指针悬挂在中间的枚举内部某个地方,等等 下面是一个例子: public string GetCurrentTransaction(string idText) { foreach (var transaction in transactions) { if (idText.IsEquivalentTo(t

类似于我的问题(其答案通常是“是的,没关系””),我想知道从foreach声明中返回是否同样没有副作用,并且被认为是公认的做法,或者当我这样做的时候,我会留下一个<强>指针<强>悬挂在中间的<强>枚举<强>内部某个地方,等等

下面是一个例子:

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

我不知道,但我要做一个有根据的猜测:因为枚举器通常不实现IDisposable,所以它应该简单地进行垃圾收集,否则该枚举器的每次使用都会泄漏非托管资源。当然,从技术上讲,您可以实现一个枚举器,它本身就有副作用


换句话说,从
foreach
块中返回时,我从未感到不安。我希望该语言能够处理一些事情,就像使用
using
语句一样,该语言确保对象被处理(通过在
finally
块中隐式调用Dispose)。

只要没有实现IDisposable(或者在它周围有一个
using
块),那么就可以了


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

不,没有任何问题

foreach循环也可以通过退出 转到、返回或投掷状态


除了从方法中的多个点返回的代码味道很小(增加了方法的圈复杂度)之外,没有任何技术原因需要担心。

据我所知,枚举一直保持在这个位置,直到下一个foreach循环。但是,这并没有问题,因为任何后续foreach都会将位置返回到枚举的开始处。简而言之:除非你依赖IEnumerator.Current有一个特定的值,否则它没有不良的副作用。

+1我同意,它会增加一些复杂性。我将创建一个字符串变量,并在找到文本并从循环中断时分配它。但是从技术角度来看,没有什么好担心的(除了其他人提到的IDisposable)。这可能更像是一个编码风格的问题。对于简单的“查找元素并返回它,或者如果找不到则返回null”,我认为有两个退出点是可以的,因为这些函数足够短,因此您可以轻松地发现两个返回点,并且不必携带另一个“returnValue”变量。IMHO,这里没有代码气味。它比将返回值写入变量更具可读性,当您希望确保不再执行任何操作时,它会一直执行到最后。实际上,
foreach
将处理
IEnumerator
,因此,如果枚举器本身是一次性的,那么就可以了。另请参见此问题中的公认答案:枚举数(继承自
IEnumerable
)确实实现了
IDisposable
IEnumerator
是从
IDisposable
派生的,为true(不知道),但
IEnumerator
不是。但是,
foreach
以C#2.0调用开头的调用在
finally
块中进行处理,因此正如我所期望的那样,语言可以处理它。您可以从
foreach
块安全返回。