与内联函数一起使用时对象表达式的开销

Overhead of Object Expressions when used with inline function

我喜欢接受的答案中使用的想法 here。我对它的理解是,它是一种将接口用作方法参数而无需实现接口的优雅方式。 SRTP 用于鸭子类型以采用一种类型(原谅 OO 术语,很高兴学习 FP 类型)到接口:

  let inline namedModel< ^T when ^T : (member Name : string)> (model:^T)= 
  { new INamed with
      member x.Name = 
        (^T : (member Name : string) model) }

在我从接受的答案中获取的上面代码中,让我感到困惑的是内联方法的运行时行为。

在我看来,每次调用此方法时,它都会创建 return INamed 的新实现。正如我在链接问题的评论中所问的那样,如果多次调用 namedModel 方法,这不会对垃圾收集器造成很大压力吗?

我真的很想使用这种方法,但我不敢继续,以免我对其内存消耗的理解是正确的。

是的,它会在每次调用时创建一个新对象。

但请记住优化的第一条规则:先测量,再优化。您确定在每次调用时创建一个对象在您的情况下都会非常昂贵吗?你量过吗?

另一件要记住的事情是,在普通代码中,您不断地创建和丢弃对象,通常甚至没有想到它。 .NET 垃圾收集器专为处理此问题而设计。