gpt4 book ai didi

c# - 调用者未获得 'finished' 的“yield”枚举 - 会发生什么

转载 作者:IT王子 更新时间:2023-10-29 04:01:56 26 4
gpt4 key购买 nike

假设我有

IEnumerable<string> Foo()
{
try
{

/// open a network connection, start reading packets
while(moredata)
{
yield return packet;
}
}
finally
{
// close connection
}
}

(或者也许我做了一个“使用”——同样的事情)。如果我的来电者走了会怎样

var packet = Foo().First();

我只剩下一个泄漏的连接。 finally 什么时候被调用?或者正确的事情总是神奇地发生吗

编辑答案和想法

我的示例和其他“正常”(foreach、..)调用模式可以很好地工作,因为它们处理了 IEnumerable(实际上是 GetEnumerator 返回的 IEnumerator)。因此,我必须在某个地方有一个调用者正在做一些时髦的事情(明确地获取一个枚举器而不是处理它或类似的东西)。我要枪毙他们

糟糕的代码

我发现一个来电者在做

IEnumerator<T> enumerator = foo().GetEnumerator();

改为

using(IEnumerator<T> enumerator = foo().GetEnumerator())

最佳答案

I am just left with a leaked connection.

不,你不是。

When does the finally get invoked?

IEnumerator<T>被处置,First在获得序列的第一项之后要做的事情(就像每个人在使用 IEnumerator<T> 时应该做的那样)。

现在如果有人写道:

//note no `using` block on `iterator`
var iterator = Foo().GetEnumerator();
iterator.MoveNext();
var first = iterator.Current;
//note no disposal of iterator

然后他们会泄漏资源,但错误在调用者代码中,而不是迭代器 block 中。

关于c# - 调用者未获得 'finished' 的“yield”枚举 - 会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37735139/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com