是否需要检查传入参数?

时间:2011-05-30 23:29:37

标签: c#

我列出了五种不同的场景,我认为产品代码中需要进行空值检查。虽然,我检查的大多数参考书都没有进行这样的检查。在原始引用尝试提供其他重要想法时忽略这些检查是合理的。在这里,我总结了我的所有问题如下,如果有错误,请纠正我。

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("s4"),
    new Student("s3"),
    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("s4"),
    new Student("s3"),
    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 个答案:

答案 0 :(得分:4)

好吧,看看界面in the documentation

事实上,IComparer所做的是错误的。

  

首选实现是使用其中一个参数的CompareTo方法。

     

允许将null与任何类型进行比较,并且在使用IComparable时不会生成异常。排序时,null被认为小于任何其他对象。

所以Compare()不能因为其中一个元素是null而抛出。

自从我们确定​​了这一点后,Sort方法不需要检查,正如我们上面所见,null排序就好了。

不知道最后一个例子。在这种情况下,我认为投掷有点苛刻。但是,无论如何,null s可能不会出现在您的收藏中。如果我有一份学生名单,至少对我来说包括null在那里没有多大意义。

这样的东西
p => p != null ? p.Name : string.Empty
可以使用

(这与null值默认强加的排序一致)。