Нулевая проверка в VB - PullRequest
       52

Нулевая проверка в VB

62 голосов
/ 07 апреля 2011

Все, что я хочу сделать, это проверить, является ли объект нулевым, но независимо от того, что я делаю, если он компилируется, он выдает NullReferenceException, просто пытаясь проверить! Вот что я сделал:

    If ((Not (comp.Container Is Nothing)) And (Not (comp.Container.Components Is Nothing))) Then
        For i As Integer = 0 To comp.Container.Components.Count() - 1 Step 1
            fixUIIn(comp.Container.Components.Item(i), style)
        Next
    End If

    If ((Not IsDBNull(comp.Container)) And (Not IsDBNull(comp.Container.Components))) Then
        For i As Integer = 0 To comp.Container.Components.Count() - 1 Step 1
            fixUIIn(comp.Container.Components.Item(i), style)
        Next
    End If

    If ((Not IsNothing(comp.Container)) And (Not IsNothing(comp.Container.Components))) Then
        For i As Integer = 0 To comp.Container.Components.Count() - 1 Step 1
            fixUIIn(comp.Container.Components.Item(i), style)
        Next
    End If

    If ((Not (comp.Container Is DBNull.Value)) And (Not (comp.Container.Components Is DBNull.Value))) Then
        For i As Integer = 0 To comp.Container.Components.Count() Step 1
            fixUIIn(comp.Container.Components.Item(i), style)
        Next
    End If

Я просматривал книги на VB, искал несколько форумов, и все, что ДОЛЖНО работать, не работает! Извините, что задала такой корректирующий вопрос, но мне просто нужно знать.

Как вы знаете, отладчик говорит, что нулевой объект - comp.Container

Ответы [ 2 ]

63 голосов
/ 07 апреля 2011

Измените And s на AndAlso s

. Стандарт And будет проверять оба выражения.Если comp.Container имеет значение Nothing, тогда второе выражение вызовет исключение NullReferenceException, поскольку вы обращаетесь к свойству нулевого объекта.

AndAlso приведет к короткому замыканию логической оценки.Если comp.Container равен Nothing, второе выражение не будет оцениваться.

32 голосов
/ 07 апреля 2011

Ваш код намного более загроможден, чем необходимо.

Заменить (Not (X Is Nothing)) на X IsNot Nothing и опустить внешние скобки:

If comp.Container IsNot Nothing AndAlso comp.Container.Components IsNot Nothing Then
    For i As Integer = 0 To comp.Container.Components.Count() - 1
        fixUIIn(comp.Container.Components(i), style)
    Next
End If

Гораздо более читабельно. ... Также обратите внимание, что я удалил избыточную Step 1 и, возможно, избыточную .Item.

Но (как указано в комментариях) циклы на основе индексов в любом случае не в моде. Не используйте их, если вам не нужно. Используйте For Each вместо:

If comp.Container IsNot Nothing AndAlso comp.Container.Components IsNot Nothing Then
    For Each component In comp.Container.Components
        fixUIIn(component, style)
    Next
End If
...