Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# F中的阴影和垃圾收集#_F#_Garbage Collection_Shadowing - Fatal编程技术网

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,数据会被删除。它不应该被垃圾收集的原因是,如果你曾经做过递归问题解决,当您将堆栈放回到堆栈上的值返回范围的点时,您可以将该状态分支到更深的搜索中。