在某些地方,实现某种类型的缓存可能会有用。例如,在基于自定义字符串进行资源查找,使用反射查找属性名称或每个属性名称仅包含一个PropertyChangedEventArgs
的情况下。
最后一个简单的例子:
public static class Cache
{
private static Dictionary<string, PropertyChangedEventArgs> cache;
static Cache()
{
cache = new Dictionary<string, PropertyChangedEventArgs>();
}
public static PropertyChangedEventArgs GetPropertyChangedEventArgs(
string propertyName)
{
if (cache.ContainsKey(propertyName))
return cache[propertyName];
return cache[propertyName] = new PropertyChangedEventArgs(propertyName);
}
}
但是,这会很好吗?例如,如果我们有很多不同的propertyNames负载,那意味着我们最终将拥有一个巨大的缓存,那里永远不会收集垃圾或任何东西。我在想,如果缓存的是更大的值,并且如果应用程序是一个长期运行的值,那么这可能最终会成为一个问题……或者您怎么看?应该如何实现良好的缓存?这足以满足大多数目的吗?一些不错的缓存实现的示例,这些实现不是很难理解,或者实现起来太复杂了?
最佳答案
您可以将每个缓存的项目包装在 WeakReference
中。如果需要的话,这将允许GC回收项目,但是,它不能让您对项目何时从缓存中消失进行任何精细控制,也无法实现明确的过期策略等。
(哈!我只是注意到MSDN page上给出的示例是一个简单的缓存类。)