如何在C#中添加项目之前确保/检查List是否为null?

时间:2013-09-09 09:41:15

标签: c# list null

当我们需要在列表中添加新项目时,我多次遇到过这种情况。根据良好的代码实践,我们应该在列表中添加新项之前检查列表是否为null。以下是让我的问题清楚的样本。这里我们有一个AddSubject()函数,它根据某些条件添加一个新主题。这里我们需要检查Subjects字段是否为空。如果为null则需要创建新列表。

例如:

var students = new Student(){Name="Raj Roy", Age= 23, Subjects = new List<string>()};

private void AddSubject(Student stud)
{
    if(stud.Age > 18>
        stud.Subjects.Add("NewSubjectName");
}

我们有两个选项来检查List字段是否为null:

if(stud.Subjects == null)
    stud.Subjects = new List<string>();

stud.Subjects = stud.Subjects ?? new List<string>();

我遵循第二种方法。

我希望你们提出关于这两种方法的最佳方法,或者是否还有其他更好的方法。

3 个答案:

答案 0 :(得分:3)

Student对象负责自己的主题:

    class Student
    {
        private readonly string name;

        private readonly int age;

        private readonly IList<string> subjects = new List<string>();

        public Student(string name, int age)
        {
            this.name = name;
            this.age = age;
        }

        public void AddSubject(string subject)
        {
            if (age > 18)
            {
                subjects.Add(subject);
            }
        }

        public IEnumerable<string> Subjects
        {
            get
            {
                return subjects;
            }
        }
    }

Law of Demeter可能会导致您重新考虑stud.Subjects.Add(..)等代码。

答案 1 :(得分:1)

事实上,

stud.Subjects = stud.Subjects ?? new List<string>();

只是

的语法糖
stud.Subjects = stud.Subjects == null ? new List<string>():stud.Subjects;

最初引入此语法是为了帮助为Nullable<T>类型提供默认值。所以我认为这个比if子句更好。但我认为它对运行时没有任何影响。

编辑:(回答@Jaroslav Kadlec)

哦,准确地说,他们的行为可能有所不同。如果stud.Subjects是属性而不是普通字段,那么stud.Subjects != null时的附加分配也可以触发stud.Subjects的访问者,这将使整个事情变得不同。

这就是为什么使用if可能会快一点,它只有一个更少的任务。

但我仍然认为这是一个VM优化问题。由于在这种情况下(假设它是一个字段),这个赋值可能已由VM内的编译器优化。但出于某种原因,他们选择不这样做。


然而,正如@topo morto所暗示的那样。我认为您最好不要将Student课程的这些实施细节公开给外界。即使您不希望默认初始化列表,也应该在Student类中初始化它。

答案 2 :(得分:0)

请注意

stud.Subjects = stud.Subjects ?? new List<string>();

的语法
stud.Subjects = stud.Subjects == null ? new List<string>():stud.Subjects;


if (stud.Subjects == null) {}
else {}

至少99%。