您也可以使用use
来控制何时调用dispose
,只需使用常见的作用域构造(如括号或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%的情况下可以满足您的需求,因此我认为它更受欢迎。
use
的原因就在于其语法更简单。许多其他语言结构都可以表示为函数(例如try .. with
,for
,while
等)。如果语言设计者添加了一个更简单的语法,为什么不使用它...use
,您也可以精确控制范围。(这样,您甚至可以在using
更简单)。use
还是using
取决于个人口味。如果您不喜欢use
的显式作用域(我承认有点奇怪,但对我来说很好用),则可以使用using
。
编辑:在类声明中,您不能编写以下内容:type Foo() =
use a = new Whatever()
// ...
因为a
的作用域可能是整个实例的生命周期。(尽管我认为这可能很有用,并且它可以自动将IDisposable
的实现添加到您的类型中)。如果使用using
,则不会遇到这种麻烦。
using
在构造函数内似乎运行良好。 - Daniel个人而言,在相同的情况下,我更喜欢使用use
而不是using
,原因是我更喜欢简洁明了的表达。
let a = some_expr
some_stuff_with_a
为了
(fun a -> some_stuff_with_a) some_expr
一个反对use
的例子,比using
更好:
using
比use
更好,因为using
可以写在一行,而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
in
е…ій”®еӯ—пјҢдҫӢеҰӮпјҡ
let xx p = (use resource = yy(p) in fct resource)
гҖӮе…¶дёӯ yy(p)
жҳҜиҺ·еҸ–иө„жәҗзҡ„еҮҪж•°пјҢfct resource
жҳҜеҜ№иө„жәҗиҝӣиЎҢж“ҚдҪңзҡ„еҮҪж•°гҖӮ - Tarmil
Dispose
是在函数结束前两行调用还是在函数结束时调用。这种情况非常罕见。只需使用use
即可。 - Brianuse
作用域结束后编写某些代码,即如果您需要正确测试已释放的对象(锁定的文件再次可写)或例如使用信号量。不过,只需将use
包装在一个函数中,在调用该函数后调用释放后的代码即可,不需要像本例中进行作用域控制。 - Abeluse ... in ...
语法来控制作用域。我甚至不知道你展示的这种括号方式也可以实现;我以为唯一的方法就是使用in
。例如:https://gist.github.com/jwosty/cfbf9cc67e9d051f2194895d37298cf9 - Jwosty