在嵌套类

时间:2015-12-15 08:32:01

标签: .net vb.net if-statement null nullreferenceexception

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

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

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

是否有另一种方法可以进行更易读的测试?

1 个答案:

答案 0 :(得分:3)

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

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

请注意,使用IsNot可以稍微整理原始代码 - 这是Microsoft建议的标准:

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