2013-10-17 47 views
0

我們有一個將C#poco對象加載到內存中的系統。 (從磁盤上的數據源反序列化)。它們被進一步緩存在ObjectCache(MemoryCache.Default)中,並通過Repository類公開。鏈是這樣的:這是內存管理方面的最佳鏈嗎?

private Dictionary<string, T> itemsDictionary; 
    private Dictionary<string, T> ItemsDictionary 
    { 
     get 
     { 
      return itemsDictionary ?? (itemsDictionary = RepositoryLoader.Load());   
     } 
    } 

    private List<T> itemsList; 
    private List<T> ItemsList 
    { 
     get 
     { 
      return itemsList ?? (itemsList = ItemsDictionary.Values.ToList()); 
     } 
    } 

    public List<T> All { get { return ItemsList; } } 

RepositoryLoader.Load() - 這個緩存在內存中緩存的字典項目...

我的問題是 - 你可以看到它也可以通過去2個緩存屬性 - 它是否會在內存消耗上創建一個複製? :)有沒有一種方法來優化這個鏈?

+1

'Values'屬性已經是'ICollection '。您可以將其作爲屬性公開。是否有你想要它作爲'List '的理由?如果是這樣,什麼?也許有更好的方法去解決這個問題。 –

回答

1

如果Tclass,同時擁有itemsDictionaryitemsList意味着您有兩個引用相同的內存位置。假設物品每個都很大,例如複雜的對象,這是可以忽略的(每個項目4或8個字節,取決於您是否運行32位或64位)。如果項目是struct s,但是,這意味着它們將被複制,並且您將使用雙倍的內存。

如果內存使用是一個問題,你會只需要ItemsList在某些時候,你可能要刪除的itemsList領域,只是把物業生成它在飛行:

return ItemsDictionary.Values.ToList(); 

另一個選項,假設你可以控制RepositoryLoader的功能,那就是編寫一個IDictionary<,>的實現,將Values公開爲例如直接輸入IReadOnlyList<T>,而不重新創建列表。

+0

謝謝你的回答!是的,T是一個類(不是結構體)。你可以請我直接給我的上下文IReadonlyList 一些例子? – Denis