为什么使用比使用更好?

时间:2011-02-18 21:05:57

标签: f# dispose idisposable resource-management

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

4 个答案:

答案 0 :(得分:20)

您可以控制何时使用use调用dispose,只需使用常规的作用域结构(如parens或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%的时间可以满足您的需求,所以我认为这是首选的原因。

答案 1 :(得分:15)

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

正如我在earlier answer you referenced中所写,即使使用use,您也可以精确控制范围。 (这样,你甚至可以在对象表达式类声明的构造函数中使用它。)但是大多数时候,自动行为很好(这使得构造比using更简单在C#)。

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

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

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

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

答案 2 :(得分:3)

就我个人而言,我更喜欢useusing

let a = some_expr
some_stuff_with_a

(fun a -> some_stuff_with_a) some_expr

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

答案 3 :(得分:0)

针对use的示例优于using

using优于useusing可以写在一行,而use则不能。{/ p>

实施例,
xx是一个函数,它使用给定参数yyp打开的资源的函数fct返回值。

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