F#とIDisposable

F#におけるIDisposableの実装方法って、なんだか情報が少ないような気がします。
洋書や海外のサイトなどでは見かけますけどね。日本人F#erはシャイなので仕方ないです。(?


ということで、載せてしまおう。
以下のような感じで大丈夫だと思います。多分。
C#の実装とは所々異なりますので、その点はご注意ください。
cleanupManagedResources 関数と
cleanupUnmanagedResources 関数をカスタマイズしてお使いください。



type FSharpClass() =
(* ... *)

member val private Disposed = false with get, set

member private this.Cleanup(disposing) =
let cleanupManagedResources () =
((* マネージド・リソースの後処理を書く *))
let cleanupUnmanagedResources () =
((* アンマネージド・リソースの後処理を書く *))

if not this.Disposed then
this.Disposed <- true
if disposing then
cleanupManagedResources ()
cleanupUnmanagedResources ()
//base.Dispose(disposing) // 親クラスのDisposeを呼び出す場合

interface IDisposable with
override this.Dispose() =
this.Cleanup(true)
GC.SuppressFinalize(this)

override this.Finalize() = this.Cleanup(false)

本日のまとめ

> 社畜.Dispose() ;;