F# 如何将局部构造函数变量转换为成员

F# 如何将局部构造函数变量转换为成员,f#,F#,我在构造函数中创建了一个计时器,并希望使该计时器成为构造类的成员。因为计时器没有被任何其他类成员引用,所以它被编译成构造函数本地的变量,因此被垃圾收集并杀死 防止这种情况发生的一种方法是创建一个虚拟引用,如 type MyClass() as o = let timer = new Timer((fun _ -> o.Tick()), null, 0, 1000) member private o.DummyRef = timer member o.Tick()

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

防止这种情况发生的一种方法是创建一个虚拟引用,如

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

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

有没有一种更简洁的方法来强制
定时器
成为成员?

因为你没有在任何地方使用
定时器,所以它被优化为本地构造函数。如果要在类型定义的其他地方使用它,那么它将被编译为类的一个字段。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()

因为您不在任何地方使用
计时器
,所以它被优化为本地构造函数。如果要在类型定义的其他地方使用它,那么它将被编译为类的一个字段。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()

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

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

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

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

谢谢
member
是我一直在寻找的神奇词汇。我在考虑
val timer:timer
语法,但是我必须使用[],使其可变并将其分配到ctor do块中。Thx
member
是我一直在寻找的神奇词汇。我在考虑
val timer:timer
语法,但是我必须使用[],使其可变并将其分配到ctor do块中。我知道。我已经把这些都写在问题里了。顺便说一句,问题中的代码确实在其他地方使用了计时器。是的,但您使用它只是为了强制编译器执行您想要的操作。我只是建议,在一个更完整的类型定义中,你可能不必担心它。我知道。我已经把这些都写在问题里了。顺便说一句,问题中的代码确实在其他地方使用了计时器。是的,但您使用它只是为了强制编译器执行您想要的操作。我只是建议,在更完整的类型定义中,您可能不必担心它。