我在构造函数中创建一个计时器,并希望使计时器成为构造类的成员.由于计时器未被任何其他类成员引用,因此它被编译为构造函数本地的变量,因此垃圾被收集和终止.
防止这种情况发生的一种方法是制作虚拟参考,例如
type MyClass() as o =
let timer = new Timer((fun _ -> o.Tick()), null, 0, 1000)
member private o.DummyRef = timer
member o.Tick() = printfn "Tick!"
Run Code Online (Sandbox Code Playgroud)
有没有更简洁的方式强迫timer成为会员?
如果你想让它成为一个成员,那么let这个工作是错误的工具,因为根据规范,编译形式(局部变量或字段)由编译器决定.你可能想要一个私有财产:
type MyClass() as o =
member val private Timer = new Timer((fun _ -> o.Tick()), null, 0, 1000)
Run Code Online (Sandbox Code Playgroud)