F# F中的阴影和垃圾收集#
这是我第一次遇到阴影,似乎没有专门针对我的问题的资源 如果我这样做F# F中的阴影和垃圾收集#,f#,garbage-collection,shadowing,F#,Garbage Collection,Shadowing,这是我第一次遇到阴影,似乎没有专门针对我的问题的资源 如果我这样做 let x = a list let x = another list 然后x将保存第二个列表的内容 我假设(根据我的指导老师所说的),第一个列表不会自动销毁,只是在范围结束时进行垃圾收集 我的问题是为什么? 为什么我们不在不可变项被隐藏后自动删除第一个列表?这会让我认为数据仍然可以以某种方式访问。如果是,怎么做 考虑以下几点: let x = list1 let y = x let x = list2 现在,即使您正在跟
let x = a list
let x = another list
然后x将保存第二个列表的内容
我假设(根据我的指导老师所说的),第一个列表不会自动销毁,只是在范围结束时进行垃圾收集
我的问题是为什么?
为什么我们不在不可变项被隐藏后自动删除第一个列表?这会让我认为数据仍然可以以某种方式访问。如果是,怎么做 考虑以下几点:
let x = list1
let y = x
let x = list2
现在,即使您正在跟踪x
,您仍然可以访问list1
。这只是一个例子——一般来说,不可能静态标识特定值的所有引用(别名)。相反,垃圾收集器在运行时识别它们
显然,在这种特定的情况下,您可能会建议使用一些特殊的支持是有意义的,事实上可能是这样的——我自己也不知道。假设x是对“列表”的唯一引用,那么是的,在您的代码示例中,“列表”符合垃圾收集的条件 然而,符合垃圾收集的条件并不意味着对象在代码中的任何特定点被回收,尤其不是“在范围的末尾”。在C++*中,事情在作用域结束时被清理的想法与析构函数有关,GC在.NET中根本就不是这样工作的。GC同时运行,可能会也可能不会在任何时间点回收任何符合条件的内容。甚至在代码退出当前作用域之前,或之后,或。GC甚至不关心您的作用域中是否有一个引用对象的变量,如果您不使用它,它就不起作用(请参阅活动性分析)
*不过,F#中也有类似的机制:请参见。您能通过在线链接识别课程吗?。如果是这样的话,那么我们中的一些人会给出更好的答案,更好地适应讲师试图教授的概念。Guy Coder,这只是一门关于函数编程范例的课程。讨论从上面的代码开始,我问为什么会发生这种情况,讲师解释了阴影,阴影很可能没有定义特殊的垃圾收集,所以我假设它是范围的结束。上面的代码是讲师在声明新变量时无意中复制粘贴的,但它当然仍然有效。您所说的范围结束是什么意思。我有一个想法,但我的想法可能不是你所想的。所以上面的代码是在main中声明的,所以main的end,也就是程序的end,数据会被删除。它不应该被垃圾收集的原因是,如果你曾经做过递归问题解决,当您将堆栈放回到堆栈上的值返回范围的点时,您可以将该状态分支到更深的搜索中。