这个对象会在 F# 中的垃圾回收中存活下来吗?

Will this object survive garbage collection in F#?

我有一个像这样的 F# 对象:

type myObject() = 
    ...
    do
        // calling a 3rd party lib that will do
        // callbacks into this object's methods

并且,在我的主要初始化中,我这样做:

let _ = myObject()

然后继续剩下的代码。

因此,此对象正在设置来自第 3 方库的回调;回调将落入此对象,但对象本身不会在任何地方被引用。

问题 1:此对象能否在垃圾回收中存活下来

问题二:如果没有,如何永久保存

我认为分配给占位符 _ 的对象是否会从声明它的位置保持引用的问题不是这里的重要问题。重要的问题是外部库是否会保留对该对象的引用。 对于我能想到的大多数普通库来说都是这种情况。例如,考虑这样的事情:

let register f = 
  let tmr = new System.Timers.Timer(1000.)
  tmr.Elapsed.Add f
  tmr.Start()

type MyObject() as this = 
  do register this.Foo
  member x.Foo(_) = printfn "hi"

let _ = MyObject()  

在这里,.NET 计时器的实现需要保留对您创建的所有计时器的引用(以便它可以触发它们),而我们创建的计时器保留对 MyObject 实例的引用.不管_是否创建引用,对象都会通过回调被引用。

我只能想到几种可以在不保留对对象的引用的情况下注册回调的方法 - 这些方法很可能是通过使用本机互操作和不安全代码。如果那是你正在做的,那么最好在静态字段中的某处创建一个全局 ResizeArray 并在那里保留对你的对象的引用。在其他所有正常情况下,您无需担心。