【问题标题】:How does a C# Memoization method retain the cache after returning a functionC# Memoization 方法在返回函数后如何保留缓存
【发布时间】: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


【解决方案1】:

您在这里所做的是创建一种closure,因此仍然可以从Memorize 方法的外部访问通过内部变量cacheDictionary.GetOrAdd 方法的引用。

因此,虽然 C# 程序范围(Memorize 方法的返回函数值仍然处于活动状态)也会阻止垃圾收集器为 Dictionary 释放内存。

还有更多关于闭包的信息here

【讨论】:

  • 所以如果我理解正确,因为对象的引用被返回(它是被返回的 Func 的一部分),它仍然存在。
  • @FrogBaxter,没错,就是这样。
猜你喜欢
  • 1970-01-01
  • 2013-10-01
  • 2018-03-04
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 2010-09-13
  • 1970-01-01
  • 2021-03-31
相关资源
最近更新 更多