2011-04-07 13 views
45

Todo lo que quiero hacer es comprobar si un objeto es nulo, pero no importa lo que haga, si se compila, arroja un NullReferenceException solo tratando de verificarlo. Esto es lo que he hecho:Verificación nula en VB

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 

He mirado a través de libros de VB, buscado en varios foros, y todo lo que debe trabajar no lo hace! Perdón por hacer una pregunta correctiva, pero solo necesito saber.

Para que lo sepas, el depurador dice que el objeto nulo es comp.Container

+0

para hacer las cosas de trabajo mientras espera una respuesta, a veces las cosas se pueden refactorizan a trabajar .. como usar un par de Ifs anidados en este caso. –

Respuesta

52

cambiar su And s a AndAlso s

Un estándar And pondrá a prueba ambas expresiones. Si comp.Container es Nothing, la segunda expresión generará una NullReferenceException porque está accediendo a una propiedad en un objeto nulo.

AndAlso cortocircuitará la evaluación lógica. Si comp.Container es Nothing, la segunda expresión no se evaluará.

26

Su código es mucho más desordenado de lo necesario.

Reemplazar (Not (X Is Nothing)) con X IsNot Nothing y omitir los paréntesis exteriores:

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 

mucho más legible. ... También observe que eliminé el Step 1 redundante y el .Item probablemente redundante.

Pero (como se señala en los comentarios), los bucles basados ​​en índices están fuera de moda de todos modos. No los use a menos que sea absolutamente necesario. Utilice For Each lugar:

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