1

假设下面这段代码缓存了两个对象集合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在缓存中是否有问题?我们应该更喜欢缓存Lists 而不是IEnumerables 吗?

4

2 回答 2

3

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

“缓存”你的IEnumerable意思是你缓存从哪里获取数据的知识。那不是你想要的。您想缓存数据本身

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


在您的示例中仍然持有对服务的引用的事实IEnumerable正是:它不持有data,它持有对服务的引用,并且在您使用它时会再次调用它。所以与你想要从缓存中得到的完全相反。

于 2018-01-18T17:51:11.710 回答
0

内存大小的区别?不。

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

IEnumerable仅强制执行读取列表的方法。它不适合修改集合。这就是为什么您希望将其转换为实际类型(如List),因此您可以使用Add.

于 2018-01-18T17:48:20.553 回答