使用F#的'use'关键字范围

时间:2011-06-10 12:09:39

标签: scope f#

假设以下代码:

let fn () =
  use a = new System.IO.StreamWriter ("d:\\test.txt")
  a

let b = fn ()
b.Write "t"

它出现以下错误:

  

ObjectDisposedException:无法写入已关闭的TextWriter。

为什么?

3 个答案:

答案 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已经被处理掉。