如何避免多次if null检查

可能重复:
Deep Null检查,有更好的方法吗?
C#优雅的方法来检查属性的属性是否为null

我必须在深度对象模型中进行查找,如下所示:

p.OrganisationalUnit.Parent.Head.CurrentAllocation.Person; 

无论如何要评估这个并返回null如果任何链为null(organizationalunit,parent,head等),而不必做

 if (p.org == null && p.org.Parent == null && p.org.Parent.Head . . . 

您正在寻找null-safe dereference运算符?. 某些语言(例如Groovy)具有的(也称为安全导航),但不幸的是C#没有此运算符。

希望它有一天会实施….

另见Eric Lippert的这篇文章 。 他提出的语法是.?

你听说过得墨忒耳法吗?

链接如此长的呼叫序列并不是一个好主意。 它会在您不需要的类之间创建可怕的依赖关系。

在您的示例中,包含p的类依赖于其他五个类。 我建议你简化你的代码,让每个类在他们自己的知识环境中检查单个级别的空值。

看看这篇文章 。 它提供了一个很好的解决方案,允许您编写类似的东西:

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

要回答标题中的问题,可以避免使用“demeter法则”并创建一个名为GetHeadOfParentOrganizationalUnit()的方法

我不确定该解决方案是否适用于您的特定情况,但如果您可以消除所有这些空检查,那么值得一看。

另请参见: 链接

您也可以使用基本的exception处理来捕获它。 我并不为这个解决方案而疯狂,但这是一个选择。 如果这些嵌套的空值是正常操作,则exception可能不是正确的答案:

 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 = cba; } catch { myA = null; } return myA; } static void Main(string[] args) { C theC = new C(); theC.b = new B(); theC.ba = new A(); A goodA = GetA(theC); if (goodA != null) { Console.WriteLine("Expected nominal path."); } else { Console.WriteLine("Unexpected nominal path."); } theC.ba = null; A badA = GetA(theC); if (badA == null) { Console.WriteLine("Expected off-nominal path."); } else { Console.WriteLine("Unexpected off-nominal path."); } } }