web-dev-qa-db-ja.com

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本を調べ、いくつかのフォーラムを検索しましたが、動作するはずのすべてが機能しません!このような改善のための質問をしてすみませんが、知っておく必要があります。

ご存知のように、デバッガーはnullオブジェクトがcomp.Containerであると言います

63
Supuhstar

AndsをAndAlsosに変更します

標準のAndは両方の式をテストします。 comp.ContainerがNothingの場合、nullオブジェクトのプロパティにアクセスしているため、2番目の式はNullReferenceExceptionを発生させます。

AndAlso は、論理評価を省略します。 comp.ContainerがNothingの場合、2番目の式は評価されません。

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