2010-12-13 79 views
9

假设我创建了一个资源封闭,如一个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()方法的包装器对象替换闭包? (这当然是一个简单的例子。)谢谢大家。

回答

7

是的,你应该用一个方法和一个Dispose()替换一个IDisposable对象的封闭。 (或者,返回一个关闭元组,其中第二个调用Close()或什么,并将其留给这样的调用者。)

(当你在它的时候,应该使用System.IO.Path.Combine(),而不是粘在一起的文件名。与字符串格式化)

+0

非常感谢Brian的快速回复。可用的F#材料似乎在谈论关闭和资源管理,但不是两者结合在一起。 – FSharpN00b 2010-12-13 07:12:06

3

我有时会做的事:

let getwriter() = 
    let writer = new StreamWriter(testfile, false) 
    (fun() -> 
    use writer = writer 
    writer.Write "test") 
+0

非常感谢您的回复Dr. Harrop。这看起来像保持了将文件从关闭中打开的工作,但在关闭时仍然关闭文件。我将在未来使用它。 – FSharpN00b 2010-12-15 05:22:22

1

IDisposable约为确定性,即明确地释放资源。因此,如果闭包自己不以某种方式提供配置功能,则资源不能再被确定性地释放。

正如Brian指出的那样,这可以或多或少是明确的,尽管实施IDisposable是可取的,因为use + IDisposable在异常情况下自动处理释放资源。

但是,有时候完全隐藏一次性资源并取而代之要完成的事情已经足够了。

let getWriter body = 
    use writer = new StreamWriter(testfile, false) 
    body(writer) 

// ... 

getWriter (fun writer -> writer.Write "test") 
+0

非常感谢您的回复Dario。据我所知,闭包被表示为另一个.NET对象。我想知道在某些时候,我们会找到一种方法来添加完成/处理代码。 – FSharpN00b 2010-12-15 08:01:34