【问题标题】:How to add a Lazy implementation to an existing public property (C#)如何将延迟实现添加到现有公共属性(C#)
【发布时间】:2016-10-10 18:46:38
【问题描述】:

所以我有这个类及其公共属性:

public static class DataStore 
{
    public static readonly List<Item> Items;
    static DataStore 
    { 
        Items = new List<Item> 
        {
            new Item {Name = "A"},
            new Item {Name = "B"},
            new Item {Name = "C"},
            ...//many more
        };
    }
}

为了节省内存,我将 List&lt;Lazy&lt;Item&gt;&gt; 添加到 DataStore:

List<Lazy<Item>> LazyItems = new List<Lazy<Item>> 
{
    new Lazy<Item>(() => new Item {Name="A"}),
    new Lazy<Item>(() => new Item {Name="B"}),


};

但是,List&lt;Item&gt; 是公共财产,在很多地方都会被引用。如何保留现有的List&lt;Item&gt; 并使用新的属性?

【问题讨论】:

  • 此更改是增加内存占用,而不是减少它。
  • 您是否首先对此进行分析以实际确定原始示例中的内存消耗是否是瓶颈?
  • 这里没有足够的上下文来帮助您。从字面上看,唯一有效的答案是“你不能那样做”。您的问题中也没有足够的信息来了解您尝试做的事情是否有用。但假设它是在您的实际场景中,您必须至少将List&lt;Item&gt; Items 更改为IList&lt;Item&gt; Items,以便您可以提供一个自定义IList&lt;Item&gt; 实现,该实现了解LazyItems 对象并可以检索那里的元素。也可以考虑使用IReadOnlyList&lt;T&gt;,因为修改任何一个列表都可能没有意义。
  • 这是一个很好的例子,说明为什么static/全局变量是不好的做法。

标签: c# lazy-initialization


【解决方案1】:

你不能。 List&lt;Item&gt; 需要具有已创建项目的完全具体化列表,因此,要拥有一个您需要已创建所有项目的列表。您不能创建部分(但不是全部)项目,同时仍将其视为List&lt;Item&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 2010-10-25
    相关资源
    最近更新 更多