Dan*_*iel 18 f# dispose idisposable resource-management
根据这个MSDN页面 上的最后一句话use是首选using.我在其他地方听过(例如这个答案).为什么是这样?我意识到use后来又添加了.但有什么区别?从表面上看,using似乎更有用,因为您可以控制何时Dispose()调用,并且(fun _ -> ...)如果需要,您可以显式忽略绑定值(例如).
Bri*_*ian 20
您可以控制何时调用dispose use,只需使用通常的作用域结构(如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"
Run Code Online (Sandbox Code Playgroud)
但我认为这很少有用.我认为不想命名/利用这个IDisposable对象也很少见. use在语法上更方便,95%的时间都能满足您的需求,所以我认为这就是为什么它更受欢迎.
Tom*_*cek 15
我认为偏好的原因use只是语法更简单.许多其他语言结构可以表示为功能(例如try .. with,for,while,...).如果语言设计者添加了更简单的语法,为什么不使用它...
正如我在前面提到的答案中所写,即使使用,也可以精确控制范围use.(这样,你甚至可以在对象表达式类声明的构造函数中使用它.)但是大多数时候,自动行为就好了(这使得构造比usingC#更简单).
无论您是使用use还是using在需要明确控制范围的情况下,都是个人品味的问题.如果你不喜欢明确的范围use(这看起来有点奇怪,我承认,但对我来说很好),你可以使用using.
编辑:在类声明中,你不能写例如:
type Foo() =
use a = new Whatever()
// ...
Run Code Online (Sandbox Code Playgroud)
因为范围a可能是(可能)实例的整个生命周期.(虽然我认为这可能很有用,它可以IDisposable为你的类型添加自动实现).如果你使用using,你不会遇到这种麻烦.