18

根据此 MSDN 页面 use上的最后一句话是要优先于using. 我在其他地方听说过(例如这个答案)。为什么是这样?我意识到use是后来添加的。但是有什么区别呢?从表面上看,using似乎更有用,因为您可以控制何时Dispose()调用,并且(fun _ -> ...)如果需要,您可以显式忽略绑定值(例如, )。

4

4 回答 4

21

您也可以控制何时调用 dispose use,只需使用通常的作用域构造(如括号或begin- end),例如

let F() =
    let x = 4
    (
        use file = System.IO.File.Open("foo.xml", System.IO.FileMode.Append)
        let z = 4
        printfn "file still open here"
    )
    printfn "file was already closed/disposed"

但我认为这很少有用。我认为不想命名/使用IDisposable对象也很少见。 use在语法上更方便,并且 95% 的时间都可以满足您的需求,所以我认为这就是首选它的原因。

于 2011-02-18T21:20:00.030 回答
15

我认为首选的原因use只是语法更简单。许多其他语言结构可以表示为函数(例如try .. with, for, while, ...)。如果语言设计者添加了更简单的语法,为什么不使用它...

正如我在您引用的先前答案中所写,即使在使用use. (这样,您甚至可以在对象表达式类声明的构造函数中使用它。)但大多数时候,自动行为很好(这使得构造比using在 C# 中更简单)。

您是否会使用useusing在需要明确控制范围的情况下是个人喜好问题。如果你不喜欢明确的作用域use(我承认这看起来有点奇怪,但对我来说很好用),你可以使用using.

编辑:在类声明中,您不能例如编写:

type Foo() =
  use a = new Whatever()
  // ...

因为范围a将(可能)是实例的整个生命周期。(尽管我认为这可能很有用,并且可以IDisposable为您的类型添加自动实现)。如果你使用using,你就不会遇到这种麻烦。

于 2011-02-18T21:21:59.777 回答
3

就个人而言,我更喜欢use出于using同样的原因,我喜欢

let a = some_expr
some_stuff_with_a

(fun a -> some_stuff_with_a) some_expr

使用绑定表单,您通常可以避免使用一组括号,并且标识符与其绑定的值之间的关联在空间上更接近并且更易于查看。

于 2011-02-19T00:13:55.950 回答
0

一个反对的例子use更好using

usinguseasusing可以写成一行,而use不能。

例如,
xx一个函数通过函数 fct 从yy使用给定参数打开的资源中返回值p

let xx p = using (yy(p)) (fun resource-> fct resource)     // <-- this is OK

let xx p  = (use resource = yy(p); fct resource)           // <-- this is Not OK
于 2013-10-20T11:56:20.383 回答