Как метод C# Memoization сохраняет кэш после возврата функции - PullRequest
0 голосов
/ 14 апреля 2020

Возился с концепциями функционального программирования и наткнулся на запоминание.

Вот пример:

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);
}

Как возвращаемая функция все еще имеет доступ к объекту словаря?

1 Ответ

0 голосов
/ 14 апреля 2020

То, что вы делаете здесь, - это создание своего рода замыкания , из-за которого ссылка на метод Dictionary.GetOrAdd через внутреннюю переменную cache все еще доступна извне Memorize метод.

Из-за этого, хотя область действия программы C#, где возвращаемое значение функции для метода Memorize все еще активно, также не позволит сборщику мусора освободить память для Dictionary.

Подробнее о замыканиях также здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...