我有一些相当简单的比较函数代码
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分支。
谁能告诉我为什么?
更新: 我试图通过插入另一个Nothing检查来修改这种情况。在我的场景中,这归结为几百个例外,执行速度是可以忍受的。不要想象有人试图对空列进行排序。
http://i.stack.imgur.com/8dnXD.png
这怎么可能?还有另一种我不知道的虚无“水平”。我需要检查thisValue和otherValue的类型吗?
函数永远不会被覆盖。我试过删除“Overridable”没有效果。
答案 0 :(得分:3)
也许thisValue
不是Nothing
,而.ToString()
正在返回Nothing的事实?试试这段代码吧:
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()
的实现(假设它是自定义类型)。