我有一个简单的序列表达式,它使用了我想在完成后清理的资源:
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" )
// ...
将
resource
在 Seq.find 完成后处理?还是我需要重新考虑我的资源管理策略?
最佳答案
它将在 IEnumerator
时被处理。无论枚举了多少项,都会被释放。对于 Seq
中的函数当函数退出时会发生这种情况(see tryFind
为例)。 GetEnumerator
很少在用户代码中直接调用,但当它被调用时应该使用 use
而不是 let
.
关于f# - 在序列表达式中使用 "use"时的资源管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21341323/