F# - 是否需要显式删除 ref 单元格?
F# - Do ref cells need to be deleted explicitly?
引用单元是否像指针一样引用堆上的数据,需要明确删除?我在网上看到的所有示例都没有明确的删除调用。
您将如何明确删除它们?
此外,如果您看一下 source code you'll see that ref cell type is just an immutable wrapper over a mutable field, and the :=
and !
operators are simply getter/setter calls。
您可以很容易地自己以类似的方式实现 ref:
type Ref<'a> = { mutable value: 'a }
let (:=) (r: Ref<_>) v = r.value <- v
let (!) (r: Ref<_>) = r.value
Are ref cells like pointers in the sense that they reference data on the heap, and need to be explicitly deleted?
没有。 F# 在 CLR 上运行,CLR 通过垃圾收集器自动管理内存。内存资源,即使是使用堆的内存资源,也不需要开发人员显式清理,事实上,不存在可以显式删除特定对象的机制。
相反,当不再有对引用单元格的引用时,引用单元格将符合垃圾回收条件。之后的某个时候,它会被 GC 自动清理。
您在 F# 中生成的大多数类型也是如此,例如记录、可区分的联合、类 等
引用单元是否像指针一样引用堆上的数据,需要明确删除?我在网上看到的所有示例都没有明确的删除调用。
您将如何明确删除它们?
此外,如果您看一下 source code you'll see that ref cell type is just an immutable wrapper over a mutable field, and the :=
and !
operators are simply getter/setter calls。
您可以很容易地自己以类似的方式实现 ref:
type Ref<'a> = { mutable value: 'a }
let (:=) (r: Ref<_>) v = r.value <- v
let (!) (r: Ref<_>) = r.value
Are ref cells like pointers in the sense that they reference data on the heap, and need to be explicitly deleted?
没有。 F# 在 CLR 上运行,CLR 通过垃圾收集器自动管理内存。内存资源,即使是使用堆的内存资源,也不需要开发人员显式清理,事实上,不存在可以显式删除特定对象的机制。
相反,当不再有对引用单元格的引用时,引用单元格将符合垃圾回收条件。之后的某个时候,它会被 GC 自动清理。
您在 F# 中生成的大多数类型也是如此,例如记录、可区分的联合、类 等