Нулевая проверка в 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
Ответы
Ответ 1
Измените And
на AndAlso
s
Стандарт And
проверит оба выражения. Если comp.Container - Nothing, то второе выражение вызывает исключение NullReferenceException, потому что вы получаете доступ к свойству на нулевом объекте.
AndAlso
приведет к короткому замыканию логической оценки. Если comp.Container - Nothing, то второе выражение не будет оцениваться.
Ответ 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
Гораздо читаем.... Также обратите внимание, что Ive удалил избыточную 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