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#
我有一个数据库连接,在一个项目的几个单独的文件中有一个类似于如下的查询:
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#