|
|
1
8
函数结果的自动缓存的另一个名称是memoization。对于公共接口,请考虑以下几点:
…简单地使用多态性将t存储在对象字典中。 扩展委托范围可以通过currying和分部函数应用来实现。像这样:
自从
另一种方法是使用反射检查委托类型,并将元组存储在字典中,而不仅仅是参数类型。简单的元组将只是一个数组包装器,其散列码和相等逻辑使用了深度比较和散列。
弱引用可以帮助无效化,但创建字典时
线程安全很容易通过为突变事件锁定内部字典来实现,但是拥有一个无锁字典可以在严重并发的情况下提高性能。那本词典可能更难编纂——有一本有趣的 presentation on one for Java here 不过。 |
|
|
2
2
哇-什么意外的事-我最近发布了一个关于 opaque keys in C# …因为我正试图实现一些与函数结果缓存相关的东西。真有趣。 这种类型的元编程在使用C时可能很困难。尤其是因为泛型类型参数会导致代码重复。为了实现类型安全,您常常在多个地方重复几乎相同的代码,使用不同的类型参数。
下面是我对您的方法的变体,它使用我的不透明键模式和闭包来创建可缓存函数。下面的示例用一个或两个参数演示了模式,但相对而言,扩展到更多参数比较容易。它还使用扩展方法创建一个透明的模式,用于使用可计算的func来包装func<gt;。
这种技术与您的方法有许多相同的限制(线程安全、保持引用等),我怀疑它们并不难克服,但它支持一种简单的方法来扩展到多个参数,并且它允许可缓存函数完全替换为常规函数,因为它们只是一个包装委托。 同样值得注意的是,如果您创建了cacheablefunction的第二个实例,您将得到一个单独的缓存。这既是一种优势,也是一种劣势……因为在某些情况下,你可能没有意识到这是在发生。 代码如下:
|
|
|
3
0
因为这主要是为了教育价值——您应该看看weakreference类,它允许GC在多线程环境中清除类中未使用的句柄。这是.NET中非常常见的缓存模式 那是说-警告清空者!每个缓存都是不同的。通过构建一个“一网打尽”的解决方案,您通常会遇到一个病态的情况,即您的“缓存”只是一个光荣的字典,其中包含许多复杂的助手方法,这些方法使您的代码难以预测。 |
|
|
4
0
我使用的是这个简单的扩展,在本例中使用的是memorycache:
示例/用法:(缓存持续时间为42秒):
|
|
|
A B · C#Excel自动调整列避免长文本时出错 1 年前 |
|
|
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 1 年前 |
|
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 1 年前 |
|
|
Sei · Avalonia/WPF将路由器传递到控制模板 1 年前 |