在HttpRuntime缓存中缓存IEnumerable或IList之间有区别吗?

时间:2018-01-18 17:40:28

标签: c# list caching ienumerable httpruntime.cache

假设以下代码缓存了两个对象集合MyObject:一个集合的类型为IEnumerable<MyObject>,另一个集合的类型为List<MyObject>。代码从缓存中检索值,然后访问集合:

class Program
{
    static void Main(string[] args)
    {
        CacheManager.CacheSomething();
    }

    public class MyService
    {
        private IEnumerable<AnObject> AnObjects
        {
            get
            {
                return new[]
                {
                    new AnObject {MyString1 = "one", MyString2 = "two"},
                    new AnObject {MyString1 = "three", MyString2 = "four"}
                };
            }
        }

        public IEnumerable<AnObject> GetEnumerable()
        {
            return AnObjects;
        }

        public List<AnObject> GetList()
        {
            // Run it out to a list
            return AnObjects.ToList();
        }
    }

    public static class CacheManager
    {
        public static void CacheSomething()
        {
            // Get service
            var service = new MyService();

            // Get the values as List and Enumerable
            var list = service.GetList();
            var enumerable = service.GetEnumerable();

            // Putting them in a cache
            HttpRuntime.Cache.Insert("list", list);
            HttpRuntime.Cache.Insert("enumerable", enumerable);

            // Get the values
            var retrievedList = HttpRuntime.Cache["list"] as List<AnObject>;
            var retrievedEnumerable = HttpRuntime.Cache["enumerable"] as IEnumerable<AnObject>;

            // Access both
            var res1 = retrievedList.ToList();
            var res2 = retrievedEnumerable.ToList();               
        }
    }

    public class AnObject
    {
        public string MyString1 { get; set; }
        public string MyString2 { get; set; }
    }
}

根据集合类型存储这些对象所需的内存量是否存在差异?

我问的原因是,当我们分析我们的应用程序时,我们注意到当我们查看依赖树时,IEnumerable有与之关联的服务。这是否意味着它也会缓存服务?

任何人都可以了解这是否值得关注?将IEnumerable存储在缓存中是一个问题吗?我们是否应该优先List s缓存IEnumerable

2 个答案:

答案 0 :(得分:1)

IEnumerable 数据。当您提出要求时,承诺接收数据。有些数据可能会实现它(数组,列表),但有时候,它不是物化数据,而是对数据库的查询。

&#34;缓存&#34;您的IEnumerable表示您将知识缓存到获取数据的位置。这不是你想要的。您想要缓存数据本身

在缓存结果之前始终实现IEnumerable s(例如使用ToList或ToArray)。否则,您最终可能会得到一个缓存,该缓存只包含一个被调用的过程来获取数据。

您的示例中的IEnumerable仍包含对服务的引用这一事实正是如此:它不包含数据,它保存对服务的引用,当你使用它时会再次调用。所以与你想要的缓存完全相反。

答案 1 :(得分:0)

记忆量的差异?否。

为什么呢? IEnumerable不是一种类型;这是一个界面。这意味着存储在IEnumerable中的任何内容实际上都是实现IEnumerable的其他类型(例如List)。

IEnumerable仅强制执行读取列表的方法。它不适合修改集合。这就是为什么你想把它转换为实际类型(如List),所以你可以使用像Add这样的方法。