为什么在方法解决后调用Equals?

时间:2017-01-11 22:05:15

标签: vb.net override equals-operator

我不知道调用我的Equals方法是什么,因为当遇到断点时没有调用堆栈(除了Equals本身和[External Code])。

我有一个UserComplete类,它有GetAll和Equals方法,还有一些包括接受一个对象数组的构造函数。 UserComplete从用户继承。用户类包括GetRows和Equals方法。

等于没什么特别的:

Public Overrides Function Equals(obj As Object) As Boolean
    If Not MyBase.Equals(obj) Then
        Return False
    End If
    Dim u As UserComplete = CType(obj, UserComplete)
    Return Me.RoleIds.Equals(u.RoleIds)
End Function

GetAll只是将object()()从数据库或缓存转换为UserComplete列表

Public Function GetAll() As IList(Of UserComplete)
    Dim rows As Object()() = GetRows()
    If IsNothing(rows) Then
        Return Nothing
    End If

    Dim completeUsers As List(Of UserComplete) = (From u In rows Select New UserComplete(DirectCast(u, Object()))).ToList()
    If IsNothing(completeUsers) OrElse Not completeUsers.Any() Then
        Return Nothing
    End If
    Return completeUsers
End Function

我从服务控制器调用GetAll并实际得到响应,没问题。然后,在完成后,将触发Equals中的断点,并且obj是具有一个值的List(Of Integers)。

如果您期望这种行为,为什么? 如果没有,你能解释它为什么会发生以及如何解决它吗?

1 个答案:

答案 0 :(得分:0)

好的,我有一些可能算作答案的信息。但是,如果有人可以解释社区情况的“原因”,我会将其标记为答案。

我解除了一些并行性,我不得不暂时帮助调试(或者永久取决于我是否决定这个列表是否会扩展很多)。我发现Equals方法属于这个

下的调用堆栈
Sessions(u.Key) = DateTime.Now

其中Sessions是一个Dictionary(Of User,DateTime)。

因此,简单的答案是,当为Dictionary项目赋值时,System.Collections.Generic库会在Dictionary中的每个键上调用Equals。