如何将本地构造函数变量转换为成员

时间:2013-09-30 15:05:55

标签: f#

我在构造函数中创建一个计时器,并希望使计时器成为构造类的成员。由于计时器未被任何其他类成员引用,因此它被编译为构造函数本地的变量,因此垃圾被收集和终止。

防止这种情况发生的一种方法是制作虚拟参考,例如

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成为会员的更简洁方式?

2 个答案:

答案 0 :(得分:5)

如果您希望它成为成员,那么let是该作业的错误工具,因为according to the spec,编译形式(局部变量或字段)由编译器确定。您可能想要私人财产:

type MyClass() as o =
    member val private Timer = new Timer((fun _ -> o.Tick()), null, 0, 1000)

答案 1 :(得分:1)

因为您没有在任何地方使用timer,所以它正在针对本地构造函数进行优化。如果您要在类型定义中的其他位置使用它,那么它将被编译为类的字段。 e.g。

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()