如何避免多次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."); } } }