假设以下代码:
let fn () =
use a = new System.IO.StreamWriter ("d:\\test.txt")
a
let b = fn ()
b.Write "t"
它出现以下错误:
ObjectDisposedException:无法写入已关闭的TextWriter。
为什么?
答案 0 :(得分:7)
use
的范围限定为fn
函数,因此当返回a
时,它也会被处理掉。
解决这个问题的最简单方法是:
let fn () =
let a = new System.IO.StreamWriter ("d:\\test.txt")
a
let main() =
use b = fn ()
b.Write "t"
main()
答案 1 :(得分:4)
为Robert(正确)答案添加更多内容:您可以使用作用域构造(括号或开始/结束)更好地控制use
的范围。请参阅Brian的answer相关问题。
答案 2 :(得分:2)
一旦变量(在您的情况下为a
)超出范围,资源就会被处置。
这意味着在致电fn
后,StreamWriter
已经被处理掉。