【发布时间】:2019-10-09 16:47:49
【问题描述】:
假设(完全假设;))我有 nuget 包,它本质上公开了一组静态扩展方法:
public static class MyNugetLibrary
{
public static int DoSomethingExpensiveAndUseful(this string input)
{
return input.Length;
}
public static int DoSomethingElseExpensiveAndUseful(this string input)
{
return (int)input.ToCharArray().First();
}
}
而且,出于理智的原因,我得出结论,这个包真正需要的是缓存。给定输入,输出是恒定的,输入是原始的。
在我的情况下,输出改变是不可能的,所以我永远不必担心缓存失效等问题。
如果只有 1 或 2 个方法,我可以将私有静态 Dictionary 添加到扩展类,并在方法中向字典询问答案。
但我很想不要重复那么多代码,而且有一个非常好的 memoize 函数:
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);
}
(从这里被盗:https://www.aleksandar.io/post/memoization/)
但我不太清楚如何使用该方法来记忆这些功能,而无需更改我的包的外部接口。
我该怎么做?
如果我们可以进一步这样做,最终用户 (MyNugetLibrary.DisableCaching()) 可以禁用缓存以防他们担心,例如内存占用。
【问题讨论】:
-
对于那些希望赢得无限互联网积分的人,另请参阅此处:stackoverflow.com/questions/56269443/… 并找出一种在一个解决方案中实现这两个目标的方法 :)
-
忽略为每个记忆动作创建字典实例的效率方面,是什么阻止您使用本文中描述的这种方法?
标签: c# nuget-package memoization