Почему этот код работает?
let myfile1 =
try
Some (System.IO.File.Open("hello.txt", System.IO.FileMode.Truncate, System.IO.FileAccess.ReadWrite))
with
ex ->
printfn "Fail" ex.Message
None
let funfiler (thatfile : System.IO.FileStream) =
if thatfile.CanWrite then
printfn "WRITABLE"
if myfile1.IsSome then
printfn "SUCCESS"
funfiler myfile1.Value
myfile1.Value.Close()
myfile1
является объектом FileStream и имеет зарезервированные разрешения на запись для файла.Два объекта FileStream, открывающие один и тот же файл с разрешениями на запись, приводят к ошибке при объявлении в одной и той же области (если не указан FileShare).Поскольку неизменяемые значения передаются по значению, новый объект FileStream создается из myfile1
в funfiler
и, таким образом, два объекта FileStream открывает тот же файл с разрешениями на запись, но в этомслучай, не возникает ошибка - почему?Кроме того, если вы закрываете объект FileStream в funfiler
, это также закрывает объект FileStream вне области видимости, поскольку операционная система теперь сообщает вызову Close
в funfiler
, что другие приложения могут записывать в файл.Тем не менее, myfile1
все еще может попытаться записать в файл, и, таким образом, вызов Close
в funfiler
будет вводить в заблуждение, если это так, верно?