我有一个简单的序列表达式,它使用了一个我想要在我完成时清理的资源:
type MyObject() =
member this.Items =
seq {
use resource = ResourcePool.Get()
let c = resource.ValueCount
if c > 0 then
for i in 0 .. c - 1 do
yield resource.GetValue i
}
如果我然后使用序列迭代,例如,在项目的中途进行迭代,资源何时会被处置?
例如:
// ...
let foo = MyObject
let item = foo.Items |> Seq.find ( fun i -> i.Name = "name" )
// ...
Seq.find结束后会resource
处理吗?或者我是否需要重新考虑我的资源管理策略?
答案 0 :(得分:5)
无论枚举了多少项,都会在处置IEnumerator
时处理。对于Seq
模块中的函数,当函数退出时会发生这种情况(see tryFind
为例)。很少直接在用户代码中调用GetEnumerator
,但在使用时,应使用use
代替let
。