如何避免多个if null检查

7

请尽量避免那种查找方法;请参见下面我回答的细节。 - CesarGon
5个回答

8
你正在寻找一种空值安全解引用运算符 ?. (也称为安全导航),一些语言(例如Groovy)拥有此运算符,但不幸的是C#没有此运算符。
希望有一天它会被实现...
另请参见Eric Lippert的这篇文章。他提出的语法是.?

它更常被称为空传播运算符空条件运算符 - Robert Koritnik
1
现在已经支持C# 6:https://msdn.microsoft.com/zh-cn/library/dn986595.aspx - Nelson Reis

7

请查看这篇文章。它提供了一个很好的解决方案,可以让你编写像这样的内容:

p.With(x => x.OrganisationalUnit)
 .With(x => x.Parent)
 .With(x => x.Head)
 .With(x => x.CurrentAllocation
 .With(x => x.Person);

7

你听说过迪米特法则吗?

链式调用的长序列不是一个好主意。它会在类之间创建不必要的可怕依赖关系。

在你的例子中,包含p的类变成了另外五个类的依赖。我建议你简化代码,并让每个类在它们自己的知识上下文中检查 nulls。


同意,但是如果有一个大型代码库需要接手,不可能一天内全部重构 :) - leora
@ooo:我明白了。在这种情况下,我认为你需要使用丑陋的空值检查链。我会尝试将其封装在一个私有方法中,以便隔离依赖项并易于识别。 - CesarGon

0
回答你标题中的问题,你可以通过应用“迪米特法则”并创建一个名为GetHeadOfParentOrganizationalUnit()的方法来避免。
我不确定这个解决方案是否适用于你的具体情况,但如果你能消除所有那些空值检查,它是值得一看的。
另请参阅:链接

1
但是函数 GetHeadofParent . . 将只有相同的嵌套空值检查 - leora
1
@oooo - 你不是真的一次性进入一个级别。每个类只与其直接合作者交流,你不会侵入合作者的内部来撕裂一些嵌套状态... 请阅读迪米特法则。从维基百科上可以看到,迪米特法则的一个缺点是有时需要编写大量的小“包装器”方法来传播方法调用到组件中。此外,一个类的接口可能会变得臃肿,因为它托管了包含类的方法,导致一个没有凝聚力接口的类。但这也可能是OO设计不良的标志。 - Gishu

-2

你可以使用基本的异常处理来捕获这个问题。我对这个解决方案并不感到满意,但它是一个选择。如果这些嵌套的空值是正常操作,那么异常可能不是正确的答案:

public class A
{
}
public class B
{
   public A a;
}
public class C
{
    public B b;
}
class Program
{
    static A GetA(C c)
    {
        A myA;
        try
        {
            myA = c.b.a;
        }
        catch
        {
            myA = null;
        }
        return myA;
    }        

    static void Main(string[] args)
    {
        C theC = new C();
        theC.b = new B();
        theC.b.a = new A();
        A goodA = GetA(theC);
        if (goodA != null)
        {
            Console.WriteLine("Expected nominal path.");
        }
        else
        {
            Console.WriteLine("Unexpected nominal path.");
        }
        theC.b.a = null;
        A badA = GetA(theC);
        if (badA == null)
        {
            Console.WriteLine("Expected off-nominal path.");
        }
        else
        {
            Console.WriteLine("Unexpected off-nominal path.");
        }

    }

}

调用异常处理系统对于正常操作似乎有些过度,但正如你所说,这是一种解决方案,需要开拓思路。 - John K
@John K:我同意 - 我唯一真正考虑这个的方式是,如果任何嵌套的空值表示“损坏”状态。此外还有一个问题,就是不知道哪个解引用破坏了系统,以及性能损失。但它确实是工具箱中的一种工具... - PatrickV

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