4

終了時にクリーンアップしたいリソースを利用する単純なシーケンス式があります。

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.findresourceの終了後に破棄されますか? それとも、リソース管理戦略を再考する必要がありますか?

4

1 に答える 1

5

IEnumerator列挙されたアイテムの数に関係なく、 が破棄されると破棄されます。モジュール内の関数のSeq場合、これは関数が終了したときに発生します (例として参照tryFind)。GetEnumeratorがユーザー コードで直接呼び出されることはめったにありませんが、その場合はuseの代わりに使用する必要がありletます。

于 2014-01-24T20:02:20.567 に答える