假设以下代码缓存了两个对象集合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
?
答案 0 :(得分:1)
IEnumerable
不数据。当您提出要求时,承诺将接收数据。有些数据可能会实现它(数组,列表),但有时候,它不是物化数据,而是对数据库的查询。
&#34;缓存&#34;您的IEnumerable
表示您将知识缓存到获取数据的位置。这不是你想要的。您想要缓存数据本身。
在缓存结果之前始终实现IEnumerable
s(例如使用ToList或ToArray)。否则,您最终可能会得到一个缓存,该缓存只包含一个被调用的过程来获取数据。
您的示例中的IEnumerable
仍包含对服务的引用这一事实正是如此:它不包含数据,它保存对服务的引用,当你使用它时会再次调用。所以与你想要的缓存完全相反。
答案 1 :(得分:0)
记忆量的差异?否。
为什么呢? IEnumerable
不是一种类型;这是一个界面。这意味着存储在IEnumerable
中的任何内容实际上都是实现IEnumerable
的其他类型(例如List
)。
IEnumerable
仅强制执行读取列表的方法。它不适合修改集合。这就是为什么你想把它转换为实际类型(如List
),所以你可以使用像Add
这样的方法。