这是我第一次遇到阴影,而且似乎没有特定于我的问题的资源。

如果我执行以下操作

let x = a list
let x = another list

然后x将保存第二个列表的内容。

我假设(根据我的讲师的话)第一个列表不会自动销毁,而只是在作用域末尾收集垃圾。

我的问题是为什么?
为什么一旦不可变对象(immutable对象)被遮盖,我们为什么不自动摆脱第一个列表?这会让我认为仍然可以以某种方式访问​​数据。如果是这样,怎么办?

最佳答案

假设x是对“列表”的唯一引用,那么是的,在您的代码示例中,“列表”可以进行垃圾回收。

但是,有资格进行垃圾回收并不意味着在代码中的任何特定点都可以回收该对象,尤其是在“作用域的末尾”。在作用域末尾清理工作的想法与C++ *中的析构函数有关,GC在.NET中根本不起作用。 GC同时运行,并且在任何时间点可能回收也可能不会回收任何符合条件的东西。即使在代码退出当前作用域之前或之后,也可能在never之前发生这种情况。 GC甚至不在乎范围内是否有引用对象的变量,如果不使用它,它就不计数(请参见 Activity 性分析)。

*尽管在F#中有类似的机制:请参见use bindings

关于f# - F#中的阴影和垃圾收集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35442144/

10-09 05:08