.net 在嵌套类中检查空(无)变量的一种简洁方法

.net 在嵌套类中检查空(无)变量的一种简洁方法,.net,vb.net,if-statement,null,nullreferenceexception,.net,Vb.net,If Statement,Null,Nullreferenceexception,如果Boolean值FormFoo.Bar.Baz.qux存在且为True,我想采取一些措施。但是,Bar和Baz是类类型的成员,可能是Nothing(在这种情况下,不应采取该操作) 我目前有以下代码,但很难看: If (Not FormFoo.Bar Is Nothing) AndAlso (Not FormFoo.Bar.Baz Is Nothing) AndAlso FormFoo.Bar.Baz.Quux Then DoSomething() End If 是否有其他更具可读性

如果
Boolean
FormFoo.Bar.Baz.qux
存在且为
True
,我想采取一些措施。但是,
Bar
Baz
是类类型的成员,可能是
Nothing
(在这种情况下,不应采取该操作)

我目前有以下代码,但很难看:

If (Not FormFoo.Bar Is Nothing) AndAlso (Not FormFoo.Bar.Baz Is Nothing) AndAlso FormFoo.Bar.Baz.Quux Then
    DoSomething()
End If

是否有其他更具可读性的方法来执行此测试?

如果您使用的是Visual Studio 2015,则可以使用来执行此操作:

If FormFoo.Bar?.Baz?.Quux Then
    ' If branch taken only if Bar and Baz are non-null AND Quux is True
    DoSomething()
End If
或者,我想您可以检查
NullReferenceExceptions
,但这有点混乱,我不鼓励在正常代码操作中抛出异常:

Try
    If FormFoo.Bar.Baz.Quux Then
        DoSomething()
    End If
Catch ex As NullReferenceException
    'ignore null reference exceptions
End Try
除此之外,您还可以将代码重构为一个单独的函数,这甚至可以使其更具可读性:

If DoINeedToDoSomething() Then
    DoSomething()
End If

Private Function DoINeedToDoSomething() As Boolean
    'return false is any object is null/nothing
    If FormFoo.Bar Is Nothing OrElse FormFoo.Bar.Baz Is Nothing Then Return False
    'object are not null so return the value of the boolean
    Return FormFoo.Bar.Baz.Quux
End Function
请注意,可以使用Microsoft推荐的标准
IsNot
,稍微整理一下原始代码:

If (FormFoo.Bar IsNot Nothing) AndAlso (FormFoo.Bar.Baz IsNot Nothing) AndAlso FormFoo.Bar.Baz.Quux Then
    DoSomething()
End If

如果您使用的是Visual Studio 2015,则可以使用来执行此操作:

If FormFoo.Bar?.Baz?.Quux Then
    ' If branch taken only if Bar and Baz are non-null AND Quux is True
    DoSomething()
End If
或者,我想您可以检查
NullReferenceExceptions
,但这有点混乱,我不鼓励在正常代码操作中抛出异常:

Try
    If FormFoo.Bar.Baz.Quux Then
        DoSomething()
    End If
Catch ex As NullReferenceException
    'ignore null reference exceptions
End Try
除此之外,您还可以将代码重构为一个单独的函数,这甚至可以使其更具可读性:

If DoINeedToDoSomething() Then
    DoSomething()
End If

Private Function DoINeedToDoSomething() As Boolean
    'return false is any object is null/nothing
    If FormFoo.Bar Is Nothing OrElse FormFoo.Bar.Baz Is Nothing Then Return False
    'object are not null so return the value of the boolean
    Return FormFoo.Bar.Baz.Quux
End Function
请注意,可以使用Microsoft推荐的标准
IsNot
,稍微整理一下原始代码:

If (FormFoo.Bar IsNot Nothing) AndAlso (FormFoo.Bar.Baz IsNot Nothing) AndAlso FormFoo.Bar.Baz.Quux Then
    DoSomething()
End If

我还将在
之后插入一个换行符,以防止水平滚动:
如果FormFoo.Bar不是空的,FormFoo.Bar.Baz不是空的,也就是FormFoo.Bar.Baz.qux,则DoSomething()如果End If
我还会在
后面插入一个换行符,以防止水平滚动:
如果FormFoo.Bar不是空的,FormFoo.Bar.Baz不是空的,也就是FormFoo.Bar.Baz.qux,那么DoSomething()End If
如果条件中的元素数量太多(3听起来不太大),我个人会依赖一个包含所有要检查的属性的循环+集合(并立即执行检查,或者在更复杂的情况下依赖函数);虽然这一切在这里并不完全适用。无论如何,我不认为这太相关;if else语句速度很快,可读性也很好。有没有理由投反对票?(不是对抗性的,但想知道如何改进这个问题)我认为你的问题不是完全离题,而是几乎离题;从某种意义上说,它不能为未来的读者提供相关的见解。正如我在上面的评论中所说,我认为任何程序员都不应该花一秒钟来分析如此无关的问题。这几乎是在玩代码,当你感到无聊时,把它当作一种纯粹的消遣。我不认为这就是所谓的。当你的问题为+2时,我确实否决了你的问题,因为在我看来,它被高估了(+你获得了+20-2=+18的净声誉)。@varocarbas好的,谢谢你的解释。我喜欢编写整洁的代码,根据我的经验,代码越简单,阅读和维护就越容易。事实上,这段代码将出现在我想作为演示发布的公共代码示例中。顺便说一句,PS:很好的参考资料,但我不同意(Meta帖子不是法律,而是可供选择的指南)。如果我喜欢一个问题/答案,但它已经有很多选票(比我认为的那种情况更值得),我不赞成。同样地,也有反对票。投票系统的全部意义在于帮助人们或多或少地找出哪些是相关的/不相关的。无论之前的投票结果如何,投票都可以避免实现这样一个目标。在投票时,我总是尽可能客观(即,不关心ASKER /回答者),但要考虑以前的投票。如果条件中的元素数量太大(3听起来不太大),我个人将依赖于一个循环+集合,包括所有的属性来检查。(并立即执行检查,或者在更复杂的情况下依赖函数);尽管所有这些都不完全适用于这里。无论如何,我认为这并不太相关;如果其他语句非常快,可读性也很好。有没有理由投反对票?(不具对抗性,但想知道如何改进该问题)我认为你的问题并不是完全离题,而是几乎离题;从某种意义上说,它不能为未来的读者提供相关的见解。正如我在上面的评论中所说,我认为任何程序员都不应该花一秒钟来分析如此不相关的问题。这几乎是在玩弄代码,在你出生时仅仅把它当作分心的东西ed.我不认为这就是所谓的。我在你的问题+2的时候投了反对票,因为在我看来,它被高估了(+你获得了净声誉+20-2=+18)@varocabas好的,谢谢你的解释。我喜欢写整洁的代码,根据我的经验,一段代码越简单,就越容易阅读和维护。事实上,这段代码将出现在我想作为演示发布的公共代码示例中。顺便说一句,PS:很好的参考,但我不同意(Meta Posits不是法律,而是可接受的准则)如果我喜欢一个问题/答案,但它已经有很多选票(比我认为的那样多),我不投赞成票。也就是说,投反对票。投票系统的全部目的是帮助人们或多或少地找出什么是相关的/不相关的。无论之前的投票结果如何,投票都可以避免实现这样的目标。投票时我总是尽可能客观(即,不关心提问者/回答者)但要考虑先前的投票。