问题描述
|
我列出了五种不同的场景,我认为在产品代码中必须进行null检查。虽然,我检查过的大多数参考书都没有进行此类检查。在原始参考文献试图提供其他重要思想时,可以忽略这些检查是合理的。在这里,我总结我的所有担忧如下,如果有错误,请纠正我。
class Student
{
public string Name { get; set; }
public Student(string name)
{
Name = name;
}
public Student() { }
public override string ToString()
{
return string.Format(\"Name: {0}\",Name);
}
}
class StudentNameComparer : IComparer<Student>
{
public int Compare(Student x,Student y)
{
if ( (x == null) || (y == null) ) // <C1> Should we check there?
throw new ArugmentNullException(\"bla bla\");
return x.Name.CompareTo(y.Name);
}
}
////////////////////////////////////////////////////
List<Student> students = new List<Student> {
new Student(\"s1\"),new Student(\"s4\"),new Student(\"s3\"),new Student(\"s2\")
};
students.Sort(delegate(Student x,Student y)
{
if ( (x == null) || (y == null) ) // <C2> Should we check there?
throw new ArugmentNullException(\"bla bla\");
return x.Name.CompareTo(y.Name);
});
////////////////////////////////////////////////////
List<Student> students = new List<Student> {
new Student(\"s1\"),new Student(\"s2\")
};
students.Sort( (x,y) =>
{
if ( (x == null) || (y == null) ) // <C3-1> Should we check there?
throw new ArugmentNullException(\"bla bla\");
return x.Name.CompareTo(y.Name);
});
Or
students.Sort( (Student x,Student y) =>
{
if ( (x == null) || (y == null) ) // <C3-2> Should we check there?
throw new ArugmentNullException(\"bla bla\");
return x.Name.CompareTo(y.Name);
});
////////////////////////////////////////////////////
List<Student> students = new List<Student> {
new Student(\"s1\"),new Student(\"s2\")
};
foreach (Student std in students.OrderBy(p =>
{
if (p == null) // <C4> Should we check there?
{
throw new ArgumentNullException(\"...\");
}
return p.Name;
}))
{
Console.WriteLine(std);
}
解决方法
好吧,只需看一下文档中的界面即可。
实际上,在“ 1”中所做的事情是错误的。
首选实现是使用参数之一的CompareTo方法。
允许将null与任何类型进行比较,并且在使用IComparable时不会产生异常。排序时,null被认为小于任何其他对象。
因此,
Compare()
不能仅仅因为the3ѭ之一而抛出。
既然我们已经确定了,那么Sort
方法就不需要检查了,正如我们在上面可以看到的null
排序很好。
不过,最后一个例子不知道。我认为在这种情况下投掷有点刺耳。但是,无论如何,null
可能不应该出现在您的收藏夹中。如果我有学生名单,至少对我来说没有3英镑的意义。
就像是
p => p != null ? p.Name : string.Empty
可以改为使用(这与默认情况下对null
值强加的顺序一致)。