C#中的Nullsafe导航[重复]

|                                                                                                                   这个问题已经在这里有了答案:                                                      
已邀请:
我绝对不会选择try-catch选项。这不仅是一种代码气味(异常驱动的开发),而且如果您担心性能,那么异常处理就不是可行的方法。 我不太了解第二种选择。您是否必须将它放在要访问Value属性的任何地方?还是在扩展方法中。 选项一看起来最干净。 关于性能:我认为您不会在选项1和2之间发现很大的差异,但是您可以在一个小的Console Project中尝试一下。只需运行第一个和第二个选项(例如1000次)并计算所需的时间。这不是一门精确的科学,但通常足以衡量性能差异。 我猜您不会看到很大的不同。我认为您正在练习微优化。除非您要在真正重要的系统上运行,否则请使用对您来说似乎最优雅的解决方案。     
我选择选项2。 选项#1:如果Obj1为空,则它将每次继续检查Obj2,Obj3,Obj4和Obj5是否为空!至少对于选项#2,一旦发现Obj1为空,就不会费心检查其余if语句-这意味着处理周期更少。 选项3当然不好。捕获异常是很麻烦的,如果您递归地遍历数千个节点,您会感觉到-别管它的气味了。 我担心的是您可能会问错问题。您声明自己正在使用XML,那么这些对象实际上就是元素,对吗? 也许如果您用不同的措词表达您的问题并提供有关XML文档结构的更多信息,我们可以编写一个Linq查询来提取该值,而无需进行所有硬编码的空检查(并且我假设您也在使用循环)。     
您确定选项2如此糟糕吗? 只要catch块不向调用者抛出任何异常,try / catch块就不会影响性能(这是导致性能下降的异常抛出机制)。 这是一个引用:   寻找和设计   大量的异常代码可能会导致   体面的性能胜利。请记住   这与try / catch无关   区块:您仅在以下情况下产生费用   实际的异常被抛出。您   可以使用尽可能多的try / catch块   你要。使用异常   无故是你输的地方   性能。例如,您应该   远离使用之类的东西   控制流的异常。 摘自http://msdn.microsoft.com/en-us/library/ms973839.aspx 显然,只要您在设计#1之类的链中某处发现空值,设计#3就不会继续进行评估,并且还避免了设计#2这样繁琐的代码编写。 我认为try / catch设计值得考虑...     
我将使用节点结构,以便您可以执行以下操作:
var hasNullValue = false;
var x = string.Empty;
var node = firstNode;

while (node.Child != null)
{
    // On the first hit we set the null flag
    // and break out of the loop
    if (node.Value == null)
    {
        hasNullvalue = true;
        break;
    }

    node = node.Child;
}

if (!hasNullValue)
    x = node.Value;
    

要回复问题请先登录注册