F#中的资源管理

时间:2016-10-17 19:27:33

标签: f#

我知道我需要使用use键盘来处理资源:

use db = new dbml.MobileDataContext(connectionString)
for rows in db.Item do 
....

但是我想创建一个返回db connection的函数:

let getConnection(connectionString) =
   use db = new dbml.MobileDataContext(connectionString)
   db.ExecuteCommand(....) |> ignore
   db

并在我的代码中使用此功能:

use db = getConnection(connectionString)      
for rows in db.Item do 
....

我是否需要在这种情况下使用use - 关键字两次:在函数和函数调用中?

2 个答案:

答案 0 :(得分:6)

您应该只在外部函数中使用getConnection。如果您在getConnection中使用它,那么您的上下文将在从{{1}}返回时处理,因此当您想要使用它时它将被置于外部函数中。作为一般规则,如果在函数中处理值,则不得返回它。

答案 1 :(得分:5)

@Tarmil有正确的答案,但我也想指出一个更惯用的替代方法来返回已经打开的连接。

您可以改为定义withConnection高阶函数,该函数将函数作为其参数。您传入的函数将接受打开的连接并返回它想要的任何结果,让withConnection处理连接的处理。这是样板:

let withConnection f =
    use db = new dbml.MobileDataContext(connectionString)
    db.ExecuteCommand(....) |> ignore
    f db

然后您可以像这样使用它,而不必担心从代码中的其他地方关闭连接:

let users = withConnection (fun conn -> conn.ExecuteQuery(...))