konto usunięte

Temat: IDisposable

Zaczynając z F# martwiłem się o to, aby nic nie zepsuć i od razu zacząłem od odpowiednika using. Taki kod C#:
string str;
using(var reader = new StreamReader(@"c:\boot.ini")) {
str = reader.ReadToEnd();
}
Console.WriteLine(str.ToUpper());

w F# wygląda moim zdaniem znacznie łatwiej:
open System.IO
let str =
use reader = new StreamReader(@"c:\boot.ini")
reader.ReadToEnd() //tu jest wywolywany dispose
str.ToUpper() |> printfn "%s"

na końcu jest wykorzystany tzw. pipe, który mi przypomina znane z Linuxa przekazywanie potoków - bardzo dobry patent, bo logiczna kolejność operacji pokrywa się faktycznym wykonywaniem.

Aby pokazać, że use faktycznie woła dispose można zrobić testowy obiekt:
open System
let dummyDisposable =
{ new IDisposable with
member x.Dispose() =
printfn "Dispose called!"
}
do
printfn "Poczatek"
use d = dummyDisposable
printfn "Tu obiekt IDisposable istnieje"
printfn "Koniec"


i znowu niejako przy okazji widać w jaki _nieobiektowy_ sposób F# traktuje interfejsy i dziedziczenie. To są chyba odpowiedniki anonimowych klas z Javy, których w C# mogło brakować.