当我们需要在列表中添加新项目时,我多次遇到过这种情况。根据良好的代码实践,我们应该在列表中添加新项之前检查列表是否为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>();
我遵循第二种方法。
我希望你们提出关于这两种方法的最佳方法,或者是否还有其他更好的方法。
答案 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%。