我在构造函数中创建一个计时器,并希望使计时器成为构造类的成员。由于计时器未被任何其他类成员引用,因此它被编译为构造函数本地的变量,因此垃圾被收集和终止。
防止这种情况发生的一种方法是制作虚拟参考,例如
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
成为会员的更简洁方式?
答案 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()