it-swarm.com.ru

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

Все, что я хочу сделать, это проверить, является ли объект нулевым, но независимо от того, что я делаю, если он компилируется, он выдает 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

59
Supuhstar

Измените свои Ands на AndAlsos

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

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

61
Ken Pespisa

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

Замените (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
31
Konrad Rudolph