F# 中的阴影和垃圾收集
Shadowing and garbage collecting in F#
这是我第一次遇到阴影,似乎没有针对我的问题的资源。
如果我执行以下操作
let x = a list
let x = another list
那么x将保存第二个列表的内容。
我假设(根据我的导师所说)第一个列表不会自动销毁,只是在范围末尾进行垃圾收集。
我的问题是为什么?
为什么我们不在不可变对象被隐藏后自动删除第一个列表?这会让我认为数据仍然可以以某种方式访问。如果是这样,如何?
考虑以下几点:
let x = list1
let y = x
let x = list2
现在即使您正在跟踪 x
,您仍然可以访问 list1
。这只是一个例子——一般来说,不可能静态地识别所有对特定值的引用(别名)。相反,垃圾收集器会在运行时识别它们。
显然,在这种特定情况下,您可能会建议获得一些特殊支持是有道理的,而且确实可能有 -- 我自己也不了解。
假设 x 是对 "a list" 的唯一引用,那么是的,在您的代码示例中,"a list" 符合垃圾回收条件。
符合垃圾回收条件并不意味着该对象在代码中的任何特定点都被回收,特别是 "at the end of the scope"。在范围末尾清理事物的想法与 C++* 中的析构函数有关,GC 在 .NET 中根本不像那样工作。 GC 同时运行,并且可能会或可能不会在任何时间点回收任何符合条件的东西。这甚至可能发生在代码退出当前作用域之前,或者更晚,或者 never。 GC 甚至不关心你是否在范围内有一个引用对象的变量,如果你没有使用它,它就不算数(参见 活性分析 )。
*不过,F# 中有类似的机制:请参阅 use bindings。
这是我第一次遇到阴影,似乎没有针对我的问题的资源。
如果我执行以下操作
let x = a list
let x = another list
那么x将保存第二个列表的内容。
我假设(根据我的导师所说)第一个列表不会自动销毁,只是在范围末尾进行垃圾收集。
我的问题是为什么? 为什么我们不在不可变对象被隐藏后自动删除第一个列表?这会让我认为数据仍然可以以某种方式访问。如果是这样,如何?
考虑以下几点:
let x = list1
let y = x
let x = list2
现在即使您正在跟踪 x
,您仍然可以访问 list1
。这只是一个例子——一般来说,不可能静态地识别所有对特定值的引用(别名)。相反,垃圾收集器会在运行时识别它们。
显然,在这种特定情况下,您可能会建议获得一些特殊支持是有道理的,而且确实可能有 -- 我自己也不了解。
假设 x 是对 "a list" 的唯一引用,那么是的,在您的代码示例中,"a list" 符合垃圾回收条件。
符合垃圾回收条件并不意味着该对象在代码中的任何特定点都被回收,特别是 "at the end of the scope"。在范围末尾清理事物的想法与 C++* 中的析构函数有关,GC 在 .NET 中根本不像那样工作。 GC 同时运行,并且可能会或可能不会在任何时间点回收任何符合条件的东西。这甚至可能发生在代码退出当前作用域之前,或者更晚,或者 never。 GC 甚至不关心你是否在范围内有一个引用对象的变量,如果你没有使用它,它就不算数(参见 活性分析 )。
*不过,F# 中有类似的机制:请参阅 use bindings。