这些对传递参数的检查是否必要?

问题描述

| 我列出了五种不同的场景,我认为在产品代码中必须进行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
值强加的顺序一致)。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...