2011-02-18 80 views
15

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

回答

12

我认为宁愿use的原因就是语法比较简单。许多其他语言结构可以表达为功能(例如try .. withfor,while,...)。如果语言设计者添加了更简单的语法,为什么不使用它...

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

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

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

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

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

16

只要使用通常的范围构造(例如parens或begin-end),例如,您可以控制何时使用use调用dispose。

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%的时间能够满足您的需求,所以我认为这就是为什么它是首选。

+2

这个语法的古怪看起来似乎是另一个赞成“使用”的理由。你知道他们是否产生不同的IL? – Daniel 2011-02-18 21:25:47

+0

我期望他们会产生类似的IL,但我不知道或不在乎。至于语法怪异性,再次,没有人像这样写代码,因为没有人关心`Dispose`在函数结束之前或者在函数结束时被称为两行。重要的情况极为罕见。只需使用`use`。 – Brian 2011-02-18 22:20:07

+0

如果您需要正确测试释放的对象(锁定的文件可以再次写入),或者例如使用信号量,则`use`范围结束后需要您编写内容的一种情况是。不过,只需在一个函数中封装`use`并在调用该函数后调用您的释放后代码就足够了,并且不需要在此示例中进行范围确定。 – Abel 2014-11-04 18:35:20

3

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

let a = some_expr 
some_stuff_with_a 

(fun a -> some_stuff_with_a) some_expr 

与结合的形式,通常可以避开一对括号,和协会标识符与其绑定的值之间的距离更近,更易于查看。

0

针对use一个实例是更好然后using

using优于useusing可以写在一行而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 
相关问题