如何在 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>();
我遵循第二种方法。
我想听听你们关于这两种方法中最好的方法的建议,或者是否有其他更好的方法。
让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%。