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


все, что я хочу сделать, это проверить, является ли объект null, но независимо от того, что я делаю, если он компилируется, он бросает 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   51   2011-04-07 18:55:04

2 ответа:

изменить Andь AndAlsos

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

AndAlso короткое замыкание логической оценки. Если комп.Контейнер-это ничто, тогда 2-е выражение не будет вычислено.

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

заменить (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