是否有通过可支配资源产生收益的正确方法?返回的对象是 IDisposable,但它迭代的元素是。
这是一个例子:
public static IEnumerable<T> Fetch(IEnumerable<Guid> ids)
{
using (var client = new CouchbaseClient())
{
yield return ids.Select(s => s.ToString());
}
}
现在,调用此方法不会处理using
获得的资源。我知道我可以直接返回 ToList 并立即返回所有内容,但是有没有办法“正确”处理这个问题,或者我是否必须在 IDisposable 资源上保留一个选项卡并在完成后手动处理它?
简而言之,只要该方法的调用者处理该方法,您就不需要担心它IEnumerator
正确地对象。
IEnumerator
实施的IDisposable
,并且用于创建迭代器块的逻辑实际上足够智能,可以在释放它时执行所有未执行的finally块。由于以下原因创建了一个finally块using
调用,这就是IDisposable
资源被处置。
所以只要IEnumerator
由此创建的对象IEnumerable
要么完全迭代(在这种情况下,最终的MoveNext
通话将到达结束using
阻止并处置资源)或处置IDisposable
客户将被处置。
请注意,如果您担心代码的用户可能不会对待IEnumerator
正确地使用对象,那么你最好的选择是不要使用具有惰性求值的迭代器块。如果您想确保即使调用者没有“表现得很好”,那么也要急切地评估该方法(即获取您拥有的代码,将结果转储到列表中,然后返回该列表)。如果不释放资源的后果主要或完全与性能相关(长时间不释放一些内存、保持连接打开等),那么它可能不是一个问题,但如果永远持有锁是一个问题主要问题(即锁定的资源如果不释放可能会导致死锁),那么惰性求值的优势可能不值得。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)