【问题标题】:Why is Equals called after method has resolved?为什么在方法解决后调用 Equals?
【发布时间】:2017-01-11 22:05:15
【问题描述】:

我不知道是什么在调用我的 Equals 方法,因为当断点被击中时没有调用堆栈(除了 Equals 本身和 [外部代码])。

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

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) 具有一个值。

如果您期望这种行为,为什么? 如果没有,您能否解释一下为什么会发生这种情况以及如何解决?

【问题讨论】:

    标签: vb.net overriding equals-operator


    【解决方案1】:

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

    我取消了一些并行性,我不得不临时帮助调试它(或永久地取决于我是否决定这个列表会扩展很多)。发现Equals方法落入了this下的调用栈

    Sessions(u.Key) = DateTime.Now
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多