f# - 在序列表达式中使用 "use"时的资源管理

标签 f# sequence resource-management

我有一个简单的序列表达式,它使用了我想在完成后清理的资源:

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/

相关文章:

c++ - 如何正确使用自定义 shared_ptr 删除器?

c++ - 5 法则(对于构造函数和析构函数)是否过时了?

arrays - 使用 textFieldDidEndEditing 文本字段委托(delegate)查找数组中的 3 个元素

java - 我必须在应用程序退出时手动关闭 Executor 吗?

f# - F# 中的 IEquatable,= 运算符性能和结构平等

visual-studio-2013 - 为什么 F# 库没有 dll 版本?

R:改变特定值的最后序列

c - 这行数字有特定的顺序吗?

.net - F# 代码不够通用(使用静态成员约束)

algorithm - 在 F# 中编写重复文件查找器的技巧