首页 > 解决方案 > GC 用于 F# 和 C# 之间的互操作

问题描述

在对函数式语言和垃圾收集进行了一些搜索之后,我发现普通命令式语言(如 Java、C#)的 GC 设计与函数式语言(如 Haskell)的 GC 设计完全不同。

这对我来说并不奇怪,因为我知道在函数式语言中改变变量状态的唯一方法是根据前一个对象创建新对象,然后销毁它,这会导致大量垃圾。

我很好奇的是,如果 dotnet 项目同时使用 C# 和 F#,那么 GC 将如何工作?我认为来自 F# 的代码会产生非常多的垃圾,这可能很难用 C# 的普通 GC 来处理。

标签: c#.netf#garbage-collection

解决方案


所有 .NET 目标语言最终都编译为 IL 并在同一运行时执行。

cli

GC 是托管语言工作方式的重要组成部分。然而,垃圾收集在函数式编程范式中并不一定更糟。大多数对象在 gen 0 中被回收,并且永远不会进入 gen 1。

您在线程安全、并行性和优化中收回的分配中所付出的代价。

当然,没有规定突变是非法的。F# 是一种多范式语言,你仍然可以在需要的地方编写高性能的命令式代码,事实上,几个核心库函数都是这样编写的。

let mutable sum = 0
for i in 0..9 do
    sum <- sum + i

推荐阅读