F#:处理关闭内部的资源?
假设我创建了一个资源封闭,如一个StreamWriter:F#:处理关闭内部的资源?
let currentdir = Directory.GetCurrentDirectory()
let testfile = sprintf "%s\\%s" currentdir "closuretest.txt"
let getwriter() =
let writer = new StreamWriter(testfile, false)
(fun() -> writer.Write "test")
有没有办法关闭的StreamWriter当我与关闭呢?或者,我是否需要用包含Write()方法和Dispose()方法的包装器对象替换闭包? (这当然是一个简单的例子。)谢谢大家。
是的,你应该用一个方法和一个Dispose()
替换一个IDisposable
对象的封闭。 (或者,返回一个关闭元组,其中第二个调用Close()
或什么,并将其留给这样的调用者。)
(当你在它的时候,应该使用System.IO.Path.Combine()
,而不是粘在一起的文件名。与字符串格式化)
我有时会做的事:
let getwriter() =
let writer = new StreamWriter(testfile, false)
(fun() ->
use writer = writer
writer.Write "test")
非常感谢您的回复Dr. Harrop。这看起来像保持了将文件从关闭中打开的工作,但在关闭时仍然关闭文件。我将在未来使用它。 – FSharpN00b 2010-12-15 05:22:22
IDisposable
约为确定性,即明确地释放资源。因此,如果闭包自己不以某种方式提供配置功能,则资源不能再被确定性地释放。
正如Brian指出的那样,这可以或多或少是明确的,尽管实施IDisposable
是可取的,因为use
+ IDisposable在异常情况下自动处理释放资源。
但是,有时候完全隐藏一次性资源并取而代之要完成的事情已经足够了。
let getWriter body =
use writer = new StreamWriter(testfile, false)
body(writer)
// ...
getWriter (fun writer -> writer.Write "test")
非常感谢您的回复Dario。据我所知,闭包被表示为另一个.NET对象。我想知道在某些时候,我们会找到一种方法来添加完成/处理代码。 – FSharpN00b 2010-12-15 08:01:34
非常感谢Brian的快速回复。可用的F#材料似乎在谈论关闭和资源管理,但不是两者结合在一起。 – FSharpN00b 2010-12-13 07:12:06