1

私は相対的な VB.Net 初心者であり、実際にやって学んでいます。私が質問しようとしていることは、以前に 10^19 回質問されていると確信していますが、コード ワードが何であれ、Google で検索する方法がわかりません。ここに行きます...

フィールドを持つ行を含む複数のテーブルで構成される 1 つ以上の Project オブジェクトを持つオブジェクト モデルがあります。これにより、アプリ全体で次のようなコードが作成されます...

Dim theColor As String = Projects(1).Tables(5).Rows(22).Fields(3)

このアプリケーションでは、この「呼び出しチェーン」内のオブジェクトが存在しない場合、 theColor の正しい値はNothing*になります。これは Excel と同じです。空の行の空のセルの値は vbnull であり、「Excel がクラッシュしました」ではありません。

ただし、これは VB.Net の仕組みではありません。たとえば、Rows(22) が存在しない場合、Nothing で Fields(3) が呼び出され、例外がスローされます。私の質問は、これにどのように対処するのが最善かということです...

1)各値をチェックして、それがNothingではないことを確認できましたが、それは恐ろしい量のコードにつながります...

If Projects(1) IsNot Nothing AndAlso Projects(1).Tables(5) AndAlso...

これらは何千もあり、これに必要なコードの量は膨大になります。

2) すべてのアクセサーを try/catch でラップすることもできますが、それは実際には (1) の別の種類です。

3) 空の値を持つ各オブジェクトの特別なインスタンスを持つことができます。たとえば、Tables(5) は NullTable を返し、Row(22) は NullRow を返します。しかし、これは常にアクセサ メソッドを使用する必要があることを意味します。基になる配列を調べるだけでは不十分です。あなたはおそらく良いことを言っているでしょうが、悲しいことに、私たちの古いコードの多くはまさにそれを行っています (はい、当たり前です)。

4) まったく別の何か?私以外の誰もが知っている魔法が欠けているのでしょうか?

4

3 に答える 3

1

GetField という関数を持つことができます

それ以外の

Dim theColor As String = Projects(1).Tables(5).Rows(22).Fields(3)

あなたが持っているだろう

Dim theColor As String = GetField(1, 5, 22, 3)

Function GetField(ByVal projectIndex As Integer, ByVal tableIndex As Integer, ByVal rowIndex As Integer, byVal fieldIndex As Integer) As Object

    If Projects(projectIndex) Is Nothing Then
        Return Nothing
    End If

    If Projects(projectIndex).Tables(tableIndex) Is Nothing Then
        Return Nothing
    End If

    If Projects(projectIndex).Tables(tableIndex).Rows(rowIndex) Is Nothing Then
        Return Nothing
    End If

    If Projects(projectIndex).Tables(tableIndex).Rows(rowIndex).fields(fieldIndex) Is Nothing Then
        Return Nothing
    End If

    Return Projects(projectIndex).Tables(tableIndex).Rows(rowIndex).fields(fieldIndex)
End Function

しかし、私は言わなければなりません...あなたがしていることはずさんに見えます。プロパティを持つクラスを使用することを考える必要があります。

于 2015-01-14T16:58:21.503 に答える