1

我有一些比较函数的相当简单的代码

    Public Overridable Function Comparer(thisValue As Object, otherValue As Object) As Integer
    Try
        If thisValue Is Nothing Then
            If otherValue Is Nothing Then
                Return 0
            Else
                Return -1
            End If
        Else
            If otherValue Is Nothing Then
                Return 1
            Else
                Return thisValue.ToString.CompareTo(otherValue.ToString)
            End If
        End If
    Catch ex As Exception
        Return 0
    End Try
End Function

try-catch 块的原因是:如果 thisValue 为 Nothing,我会在实际比较行得到 NullReferenceException。调试器向我显示 thisValue 是“Nothing”,但无论如何都会落在 ELSE 分支中。

谁能告诉我为什么?

更新:我试图通过插入另一个无检查来修改这种情况。在我的场景中,这归结为几百个异常,执行速度是可以忍受的。不想想象有人试图对空列进行排序。

http://i.stack.imgur.com/8dnXD.png

这怎么可能?是否还有另一个我不知道的虚无“级别”。我需要检查 thisValue 和 otherValue 的类型吗?

函数永远不会被覆盖。我尝试删除“可覆盖”无效。

4

1 回答 1

3

也许不是那样thisValue,而是返回 NothingNothing的事实?.ToString()试试这个代码来测试一下:

Public Overridable Function Comparer(thisValue As Object, otherValue As Object) As Integer
    Try
        If thisValue Is Nothing Then
            If otherValue Is Nothing Then
                Return 0
            Else
                Return -1
            End If
        Else
            If otherValue Is Nothing Then
                Return 1
            Else

                Dim thisValueStr As String = thisValue.ToString()
                Dim otherValueStr As String = otherValue.ToString()

                'HERE, CHECK THE TWO STRINGS FOR NULL!!!

                Return thisValueStr .CompareTo(otherValueStr )

            End If
        End If
    Catch ex As Exception
        Return 0
    End Try
End Function

如果是这种情况,请仔细检查ToString()正在传递的对象中的实现(假设它是自定义类型)。

于 2013-08-26T11:52:55.907 回答