首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否需要对传入参数进行这些检查?

是否需要对传入参数进行这些检查?
EN

Stack Overflow用户
提问于 2011-05-31 07:29:37
回答 1查看 64关注 0票数 3

我列出了五种不同的场景,我认为在产品代码中必须进行null检查。虽然,我查过的大多数参考书都没有做这样的检查。当原始参考文献试图传递其他重要的想法时,忽略这些检查是合理的。在这里,我将我的所有问题总结如下,如果有错误,请纠正我。

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

发布于 2011-05-31 07:33:56

好了,看看in the documentation接口就知道了。

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

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

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

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

因为我们已经确定了这一点,所以Sort方法不需要检查,正如我们在上面看到的那样,null的排序很好。

不过,我对最后一个例子一无所知。我认为在这种情况下投掷有点苛刻。但是,无论如何,null%s可能不会出现在您的集合中。如果我有一个学生列表,至少对我来说,在其中包括null没有多大意义。

就像这样

代码语言:javascript
复制
p => p != null ? p.Name : string.Empty

可以改为使用(这将与默认情况下对null值施加的顺序一致)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6181594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档