F#:处理闭包内的资源?

时间:2010-12-13 05:23:27

标签: f# closures dispose

假设我在诸如StreamWriter之类的资源上创建了一个闭包:

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()方法的包装器对象替换闭包? (这当然是一个微不足道的例子。)谢谢大家。

3 个答案:

答案 0 :(得分:7)

是的,您应该使用方法和IDisposable替换Dispose()对象。 (或者,返回一个闭包元组,第二个调用Close()或诸如此类的东西,并将其留给调用者。)

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

答案 1 :(得分:3)

我有时会这样做:

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

答案 2 :(得分:1)

IDisposable确定性有关,即明确释放资源。因此,如果闭包本身不以某种方式提供处置功能,则资源不能再确定性地释放。

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

然而,有时候完全隐藏一次性资源并关闭将要完成的工作就足够了。

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

// ...

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