【发布时间】:2020-07-27 13:01:09
【问题描述】:
一直在玩弄函数式编程概念并遇到了 memoization。
这是一个例子:
public static Func<T, TResult> Memoize<T, TResult>(this Func<T, TResult> f) {
var cache = new ConcurrentDictionary<T, TResult>();
return a => cache.GetOrAdd(a, f);
}
返回的函数如何仍然可以访问字典对象?
【问题讨论】:
-
对字典的引用由 lambda 保留,从而防止
cache的垃圾收集,即使在线程离开Memoize()、according to the docs 之后也是如此。 -
顺便说一句,记住一个变量,为一个值保存整个字典,这太过分了。字典至少有一个
List和一个树(一个堆),外加大量的辅助对象来处理并发。 -
@Blindy,我认为(或希望)重点是为许多值实现缓存。
-
@Blindy 这本字典里会有很多值,而不仅仅是一个
-
不是你写它的方式,你为每次调用创建一个新字典,并在其中只推送一个值。
标签: c# .net functional-programming