如何检查一个对象是否为空?

20

如何检查传递给方法的对象是否为null?

在调用方法之前需要对对象进行测试吗?还是在使用参数的方法内部进行检查?

public class Program
{
    public static void Main(string[] args)
    {
        // Check if person is null here? or within PrintAge?

        PrintAge(new Person { Age = 1 });
    }

    private static void PrintAge(Person person)
    {
        // check if person is null here?

        Console.WriteLine("Age = {0}", person.Age);
    }
}

public class Person
{
    public int Age { get; set; }
}

在两个类中都进行"null"检查似乎会有太多的冗余代码。

[编辑]: 在调用者或被调用者中检查null的优缺点是什么?

[编辑2]: 我刚刚了解到防御式编程,它似乎主张在被调用者内检查null。我想知道这是否是一种广为接受的做法。


你可以查看这个链接,了解一个直接的分析如何检查对象是否已定义? - CeganB
13个回答

0

冗余代码并不是最优雅的,但它是安全的。

这取决于你的预期用户是谁,如果是你自己,那么你可以控制一切的使用方式,只有在你不确定变量状态时才需要进行检查。

如果你为其他人编写代码,则空值检查可能是一个好主意。即使你只是抛出一个NullPointerException,也比快速失败要好。


0

一定要检查PrintAge,这是一个正确的检查位置。它可能会有冗余,但除非您每秒执行1000次,否则不会对任何人造成伤害。(根据检查情况抛出异常或修复它)

其他检查取决于您实际的流程,在这个例子中,您没有流程,所以我无法对此进行评论。但通常将参数视为受污染的。


为什么在“PrintAge”中检查可空性会是“正确的检查位置”?我最初担心冗余代码无处不在... - dance2die
我认为这是正确的做法,因为如果您从其他地方调用PrintAge,它仍将正常运行(或者至少更好)。 - dr. evil
但是很明显,当你有多个类似的PrintAge函数时,它会导致冗余,而且对此也没有太多可以做的。 - dr. evil

0

PrintAge应该是Person类的一个方法,而不是一个静态方法,需要传入Person参数。无需进行检查。

检查null值会使代码变得不必要地复杂。构建你的代码结构以限制(或消除)可能出现null值的情况,这样你就会少写很多检查。


在调用方或被调用方中,检查空值会使代码变得不必要地复杂。 - dance2die
两个地方。我的偏好是完全不需要检查。 - Morendil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接