F#关键字use和using的用法

24

我正在尝试在 F# 中使用 System.Data.Sqlite。在 C# 中,我的代码看起来像:

 using (DbTransaction dbTrans = con.BeginTransaction()) {
     using (SQLiteCommand cmd = con.CreateCommand()) {
         //blahblah
     }
     dbTrans.Commit();
 }

但在F#中,当我使用类似上面两个using的时候,我会遇到类型bool与类型IDisposable不兼容的错误...

编辑 对于我的问题,我真的很抱歉。在F#中use会起作用。我只是不知道如何关闭/删除我的问题。


6
我不知道你是否真的需要删除这个问题。这并不是一个糟糕的问题:它得到了一票支持和两个不错的回答。 - Benjol
2个回答

25

补充一些细节 - 如果您需要明确标记命令有效的范围(以获得与C#示例中完全相同的行为,其中在调用Commit之前cmd被处理),则可以编写:

use dbTrans = con.BeginTransaction()
( use cmd = con.CreateCommand()
  cmd.BlahBlahBlah() )
dbTrans.Commit()

作用域只是定义符号的表达式的一部分,因此您可以使用括号使其明确。

using只是一个F#函数,在特殊语法use添加之前,您可以使用它。只是为了信息,语法看起来像这样:

using (con.BeginTransaction()) (fun dbTrans ->
  using (con.CreateCommand()) (fun cmd ->
    cmd.BlahBlahBlah() )
dbTrans.Commit() )

使用use编写代码肯定是更好的选择(但你也可以像使用using一样定义函数来封装更有趣的行为,例如事务)。


15

在 F# 中是这样的

use dbTrans = new con.BeginTransaction ()
并且
use cmd = con.CreateCommand()

这些将会在你的函数结束时释放。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接