【发布时间】:2016-10-10 15:33:37
【问题描述】:
假设我有
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())
【问题讨论】:
-
我的最佳猜测:只返回第一个
packet(?) -
@MaciejLos 这没有回答他提出的问题。
-
@Servy,我知道。这就是我发表评论的原因。如您所见,我在语句末尾添加了
?,因为我不确定。感谢您的评论。
标签: c# yield-return