在某些地方,实现某种类型的缓存可能会有用。例如,在基于自定义字符串进行资源查找,使用反射查找属性名称或每个属性名称仅包含一个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上给出的示例是一个简单的缓存类。)

08-03 23:14