0

当我们需要向列表中添加新项目时,我多次遇到这种情况。根据良好的代码实践,在列表中添加新项目之前,我们应该始终检查列表是否为空。以下是使我的问题清楚的示例。这里我们有一个 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 字段是否为空:

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

或者

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

我遵循第二种方法。

我想要你们关于这两种方法中最好的方法的建议,或者是否有其他更好的方法。

4

3 回答 3

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;
            }
        }
    }

墨忒耳法则可能会让您重新考虑诸如stud.Subjects.Add(..).

于 2013-09-09T10:04:40.503 回答
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是属性而不是普通字段,额外的赋值 whenstud.Subjects != null也可能触发 的访问器stud.Subjects,这会使整个事情变得不同。

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

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


但是,正如@topo morto 所建议的那样。我认为你最好不要将你的Student类的这些实现细节暴露给外界。即使您不想默认初始化列表,您仍然应该在您的Student类中初始化它。

于 2013-09-09T10:09:51.670 回答
0

注意

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

是语法糖

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

或者

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

至少 99%。

于 2013-09-09T10:49:59.983 回答