web-dev-qa-db-fra.com

Enregistrement nul VB

Tout ce que je veux faire, c'est vérifier si un objet est nul, mais quoi qu'il fasse, s'il compile, il jette un NullReferenceException juste essayer de vérifier! Voici ce que j'ai fait:

    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

J'ai parcouru les livres VB, cherché dans plusieurs forums et tout ce qui DEVRAIT fonctionner ne fonctionne pas! Désolé de poser une telle question, mais j'ai simplement besoin de savoir.

Juste pour que vous sachiez, le débogueur dit que l'objet null est comp.Container

63
Supuhstar

Changez votre Ands en AndAlsos

Un standard And testera les deux expressions. Si comp.Container a la valeur Nothing, la deuxième expression lève une exception NullReferenceException car vous accédez à une propriété sur un objet null.

AndAlso court-circuitera l'évaluation logique. Si comp.Container vaut Nothing, la deuxième expression ne sera pas évaluée.

65
Ken Pespisa

Votre code est beaucoup plus encombré que nécessaire.

Remplacer (Not (X Is Nothing)) avec X IsNot Nothing et omettez les parenthèses extérieures:

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

Beaucoup plus lisible. ... Notez également que j’ai supprimé le fichier redondant Step 1 et le probablement redondant .Item.

Mais (comme indiqué dans les commentaires), les boucles basées sur des index sont de toute façon hors de mode. Ne les utilisez pas sauf obligation absolue. Utilisation For Each au lieu:

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
32
Konrad Rudolph