初始化集合,以便用户不必

时间:2009-02-18 04:32:30

标签: c# collections

这可能是一个愚蠢的问题,但有没有为用户初始化集合属性的常见做法,所以在类中使用它之前,他们不必新建一个新的具体集合?

这些中的任何一种都优先于另一种吗?

选项1:

public class StringHolderNotInitialized
{
    // Force user to assign an object to MyStrings before using
    public IList<string> MyStrings { get; set; }
}

选项2:

public class StringHolderInitializedRightAway
{
    // Initialize a default concrete object at construction

    private IList<string> myStrings = new List<string>();

    public IList<string> MyStrings
    {
        get { return myStrings; }
        set { myStrings = value; }
    }
}

选项3:

public class StringHolderLazyInitialized
{
    private IList<string> myStrings = null;

    public IList<string> MyStrings
    {
        // If user hasn't set a collection, create one now
        // (forces a null check each time, but doesn't create object if it's never used)
        get
        {
            if (myStrings == null)
            {
                myStrings = new List<string>();
            }
            return myStrings;
        }
        set
        {
            myStrings = value;
        }
    }
}

选项4:

还有其他好的选择吗?

3 个答案:

答案 0 :(得分:10)

在这种情况下,我没有看到延迟加载的原因,所以我会使用选项2.如果要创建大量这些对象,那么产生的分配和GC的数量将是一个问题,但这不是真正需要考虑的事情,除非事后证明这是一个问题。

此外,对于这样的事情,我通常不允许将IList分配给类。我会把这个只读。在不控制IList的实现的情况下,您可以打开自己的意外实现。

答案 1 :(得分:2)

对于选项1:如果您想在使用类之前强制用户初始化某些内容,那么最好强制它在构造函数中。

对于选项2:如果您没有强制用户,那么您必须自己在构造函数/初始化程序中初始化一个空集合。

对于选项3:懒惰初始化只有在涉及太多工作或操作缓慢/笨重时才有意义。

我的选票是选项2。

答案 2 :(得分:1)

使用延迟加载解决方案的唯一真正原因是进行优化。优化的第一条规则是“除非你已经测量过,否则不要优化”:)

基于此,我会选择最不可能导致错误的解决方案。在这种情况下,这将是解决方案#2。在初始化程序中设置它几乎消除了空引用的可能性。它将发生的唯一方法是用户显式将其设置为null。