0

コンストラクターでタイマーを作成し、タイマーを構築されたクラスのメンバーにしたいと考えています。タイマーは他のクラス メンバーによって参照されないため、コンストラクターに対してローカルな変数にコンパイルされ、ガベージ コレクションが実行されて強制終了されます。

これを防ぐ方法の 1 つは、次のようなダミー参照を作成することです。

type MyClass() as o =
    let timer = new Timer((fun _ -> o.Tick()), null, 0, 1000)

    member private o.DummyRef = timer
    member o.Tick() = printfn "Tick!"

強制的timerにメンバーになるためのより適切な方法はありますか?

4

2 に答える 2

5

メンバーにしたい場合は、仕様によると、コンパイルされた形式(ローカル変数またはフィールド)がコンパイラによって決定されるletため、ジョブには不適切なツールです。おそらくプライベート プロパティが必要です。

type MyClass() as o =
    member val private Timer = new Timer((fun _ -> o.Tick()), null, 0, 1000)
于 2013-09-30T15:51:10.957 に答える
1

timerどこにも使用しないため、コンストラクタローカルに最適化されています。型定義の別の場所で使用すると、クラスのフィールドとしてコンパイルされます。例えば

type MyClass() as o =
    let timer = new Timer((fun _ -> o.Tick()), null, 0, 1000)

    member o.Tick() = printfn "Tick"

    interface IDisposable with
        member x.Dispose() = timer.Dispose()
于 2013-09-30T15:30:45.580 に答える