如何在 C# 中添加项之前确保/检查列表不为 null

本文关键字:检查 确保 列表 null 添加 | 更新日期: 2023-09-27 18:30:42

当我们需要向列表中添加新项目时,我多次遇到这种情况。根据良好的代码实践,在列表中添加新项之前,我们应该始终检查列表是否为 null。下面是让我的问题清楚的示例。这里我们有一个函数 AddSubject(),它根据某些条件添加一个新主题。在这里,我们需要检查主题字段是否为空。如果为 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");
}

我们有两个选项来检查列表字段是否为空:

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

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

我遵循第二种方法。

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

如何在 C# 中添加项之前确保/检查列表不为 null

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(..) 之类的代码。

事实上,

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

只是一个语法糖

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

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

编辑:(回答@Jaroslav卡德莱克)

哦,准确地说,他们的行为可能不同。如果stud.Subjects是一个属性而不是一个普通字段,那么stud.Subjects != null时的额外赋值也可能触发stud.Subjects的访问器,这将使整个事情变得不同。

这就是为什么使用 if 可以更快一点,它少了一个任务。

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


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

注意

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

是语法的

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


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

至少在 99%。