область действия ключевого слова use с использованием F # - PullRequest
1 голос
/ 10 июня 2011

Допустим следующий код:

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

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

Выдает следующую ошибку:

ObjectDisposedException: Невозможно записать в закрытый TextWriter.

Почемуэто что?

Ответы [ 3 ]

7 голосов
/ 10 июня 2011

use относится к функции fn, поэтому, когда возвращается a, она также удаляется.

Самый простой способ исправить это:

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

let main() = 
  use b = fn ()
  b.Write "t"
main()
4 голосов
/ 10 июня 2011

Чтобы добавить еще немного к правильному ответу Роберта: вы можете добиться еще более точного контроля над областью действия use с помощью объемных конструкций (скобки или начало / конец).См. Ответ Брайана на связанный вопрос.

2 голосов
/ 10 июня 2011

Ресурс будет удален, как только переменная (в вашем случае a) выйдет из области видимости.

Это означает, что после вызова fn StreamWriter уже будет утилизирован.

...