F# 中的计算是否在完成时调用 Dispose()?

Do computations in F# call Dispose() on completion?

我有一个数据库连接,在一个项目的几个单独的文件中有一个类似于如下的查询:

SqlTypes.fs

module SqlTypes
open FSharp.Data.TypeProviders

type DBType = SqlDataConnection<ConnectionStrings.DbConnStr>

let getDb() = DBType.GetDataContext() //will this cause a memory leak when called from outside here?

Utilities.fs

module Utilities
open System
open SqlTypes
open System.Linq

///Returns an IQueryable of Orders whose OrderStatus is less than 5 (Not yet released)
let private getOrdersNotYetReleased () =
    let orders = query {
        for order in getDb().Orders do //memleak here?
        where(order.Status < 5)
        sortBy (order.CreatedDateUtc)
        select order
    }
    //return
    orders

问:是否有必要使用 use 子句(如下所示)来防止内存泄漏?

///Returns an IQueryable of Orders whose OrderStatus is less than 5 (Not yet released)
let private getOrdersNotYetReleased () =
    use db = DBType.GetDataContext() //is this safer? Does it matter if this `use` is here?
    let orders = query {
        for order in db.Orders do 
        where(order.Status < 5)
        sortBy (order.CreatedDateUtc)
        select order
    }
    //return
    orders

或者,在计算块退出时是否会在Db对象上调用Dispose()

IDisposable 模式提供了 Dispose() 方法。 use 关键字可以利用这种模式;如果 class 实现了 IDisposable,class 的作者告诉你在他们的 class 中使用 use 关键字可能是个好主意。

Dispose()方法实际做什么完全取决于class的作者为Dispose()方法写了什么代码。甚至不能保证它会做任何事情。

Microsoft 关于 IDisposable 的官方说法一直是其目的是“清理非托管资源”,但实际上,Dispose() 会按照 class 作者认为的那样去做它需要做的是优雅地关闭对象。它通常 而不是 做的是从托管对象中恢复内存;这就是垃圾收集器的目的。

但是,一般来说,如果 class 实现了 IDisposable,这意味着它包含一个 Dispose() 方法,该方法对对象的处置有一些意义,比如关闭文件或例如,数据库连接。所以。 Class 实施 IDisposable?使用use

进一步阅读
Managing Resources in F#