gpt4 book ai didi

c# - 使用 IDisposable 资源进行屈服

转载 作者:可可西里 更新时间:2023-11-01 09:11:04 25 4
gpt4 key购买 nike

是否有通过一次性资源产生 yield 的适当方法?返回的对象是 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 ,并且用于创建迭代器 block 的逻辑实际上足够智能,可以在处置时执行所有未执行的 finally block 。 using 的结果是创建了一个 finally block 打电话,这就是IDisposable的地方资源被释放。

所以只要IEnumerator从此 IEnumerable 创建的对象完全迭代(在这种情况下,最终的 MoveNext 调用将到达 using block 的末尾并释放资源)或释放 IDisposable客户端将被处置。

请注意,如果您担心代码的用户可能不会对待 IEnumerator对象,那么你最好的选择是不要使用带有惰性求值的迭代器 block 。如果您想确保即使调用者不“玩得好”,那么急切地评估该方法(即获取您拥有的代码,将结果转储到列表中,然后返回该列表)。如果不处理资源的后果主要或完全与性能相关(不再释放一些内存,保持打开连接等),那么它可能不是一个问题,但如果永远持有锁是一个问题主要问题(即,如果不释放可能导致死锁的锁定资源),那么惰性求值的优势可能不值得。

关于c# - 使用 IDisposable 资源进行屈服,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13504637/

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