缓存扩展方法的结果

本文关键字:结果 方法 扩展 缓存 | 更新日期: 2023-09-27 18:27:26

我对缓存/存储在任意对象上执行的扩展方法的结果的方法感兴趣。

其目的是避免重复昂贵的操作。以这个扩展方法为例,将一个整数转换为包含其数字的整数数组。请忽略对方法本身的潜在优化。。。那不是我所关心的。

    public static int[] Digits(this int i)
    {
        List<int> n = new List<int>();
        for (; i > 0; i /= 10)
            n.Add(i % 10);
        n.Reverse();
        return n.ToArray();
    }

如果对同一对象调用该方法两次,则必须执行两次。我的第一种方法是缓存结果并检查对象相等性:

static class Extensions
{
    public static int[] Digits(this int i)
    {
        int[] cache;
        if (ExtensionCache.IsIntegerDigitized(i, out cache))
            return cache;
        List<int> n = new List<int>();
        for (; i > 0; i /= 10)
            n.Add(i % 10);
        n.Reverse();
        ExtensionCache.CacheIntegerDigitization(i, n.ToArray());
        return n.ToArray();
    }
}
static class ExtensionCache
{
    static Dictionary<int, int[]> _digitizedIntegerCache;
    public static Dictionary<int, int[]> DigitizedIntegerCache
    {
        get { return _digitizedIntegerCache ?? (_digitizedIntegerCache = new Dictionary<int, int[]>()); }
    }
    static public bool IsIntegerDigitized(int i, out int[] digits)
    {
        if (DigitizedIntegerCache.ContainsKey(i))
        {
            digits = DigitizedIntegerCache[i];
            return true;
        }
        else
        {
            digits = null;
            return false;
        }
    }
    static public void CacheIntegerDigitization(int i, int[] digits)
    {
        if (DigitizedIntegerCache.ContainsKey(i))
            return; 
        DigitizedIntegerCache.Add(i, digits);
    }
}

我在这里预见到的最大问题是缓存结果和未检查内存消耗的字典越来越多。我不想在超出范围的对象上保留结果缓存。

在本例中,我使用了int,一种值类型,但我感兴趣的是一种涵盖引用和值类型的解决方案。

缓存扩展方法的结果

您可以考虑使用MemoryCache,而不是编写自己的缓存类。它能够根据绝对或滑动时间窗口限制内存使用或删除缓存项。