我喜欢这里接受的答案中使用的思想。我对它的理解是,这是一种将接口用作方法参数而无需实现接口的优雅方式。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) }
在上面的代码中,我从公认的答案中获取的是内联方法的运行时行为,这让我感到困惑。
在我看来,此方法每次调用时都会创建并返回 INamed 的新实现。正如我在链接问题的评论中问的那样,如果多次调用该方法namedModel
这不会给垃圾收集器带来很大的压力吗?
我真的很想使用这种方法,但我不敢继续,以免我对它的内存消耗的理解是正确的。
是的,它将在每次调用时创建一个新对象。
但请记住优化的第一条规则:首先测量,然后优化。您确定在您的情况下,在每次调用时创建一个对象会非常昂贵吗?你测量过吗?
要记住的另一件事是,在普通代码中,您不断创建和丢弃对象,通常甚至没有想到它。.NET 垃圾回收器专门设计用于处理此问题。