0

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

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

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 回答