使用IDisposable资源产生
是否有通过可支配资源获得收益的适当方式? 返回的对象是IDisposable,但它迭代的元素是。
这是一个例子:
public static IEnumerable Fetch(IEnumerable ids) { using (var client = new CouchbaseClient()) { yield return ids.Select(s => s.ToString()); } }
现在,调用它不会处理获得的using
资源。 我知道我可以只是一个ToList并立即返回它,但有没有办法处理这个“正确”,或者我必须在IDisposable资源上保留一个标签并在我完成后手动处理它?
简而言之,只要方法的调用者正确处理IEnumerator
对象,您就不必担心它。
IEnumerator
实现了IDisposable
,并且用于创建迭代器块的逻辑实际上足够智能,可以在处理时执行所有未执行的finally块。 作为using
调用的结果创建finally块,这是IDisposable
资源被放置的位置。
因此,只要从此IEnumerator
创建的IEnumerator
对象完全迭代(在这种情况下,最终的MoveNext
调用将到达using
块的末尾并处置资源)或处置IDisposable
客户端将被处置。
请注意,如果您担心代码的用户可能无法正确处理IEnumerator
对象,那么最好的办法是不要使用具有延迟评估的迭代器块。 如果你想确保即使调用者没有“玩得好”,那么急切地评估方法(即获取你拥有的代码,将结果转储到列表中,然后返回该列表)。 如果不处理资源的后果主要或完全与性能相关(不再释放一些内存,保持打开连接等)那么它可能不是一个问题,但如果永远保持锁定是一个主要问题(即锁定的资源,如果没有释放可能导致死锁)那么懒惰评估的优势可能不值得。