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