7

IDisposableインターフェイスを実装するクラスをF#で作成しました。クラスは正しくクリーンアップされ、useキーワードはDisposeメソッドにアクセスできます。Disposeメソッドを明示的に呼び出す必要があり、以下の例では呼び出せない2番目のユースケースがあります。クラスでDiposeメソッドを使用できないように見えます。

open System

type Foo() = class
    do
        ()

    interface IDisposable with
        member x.Dispose() =
            printfn "Disposing"

end

let test() =
    // This usage is ok, and correctly runs Dispose()
    use f = new Foo()


    let f2 = new Foo()
    // The Dispose method isn't available and this code is not valid
    // "The field , constructor or member Dispose is not defined."
    f2.Dispose()

test()
4

2 に答える 2

10

F#クラスでのインターフェイスの実装は、C#での明示的なインターフェイスの実装に似ています。つまり、インターフェイスのメソッドはメソッドのパブリッククラスにはなりません。それらを呼び出すには、クラスをインターフェースにキャストする必要があります(失敗することはありません)。

これは、呼び出すDisposeには次のように書く必要があることを意味します。

(f2 :> IDisposable).Dispose()

実際には、これはあまり必要ありません。これは、値がスコープ外になったときにuseキーワードが自動的に呼び出されるようにするためです。そのため、次のように記述します。Dispose

let test() =
  use f2 = new Foo()
  f2.DoSomething()

ここでは、関数が戻っf2たときに破棄されます。test

于 2013-01-22T03:23:31.173 に答える