2017-01-11 3 views
1

Ich weiß nicht, was meine Equals-Methode aufruft, denn wenn der Breakpoint getroffen wird, gibt es keinen Call-Stack (außer Equals selbst und [External Code]).Warum wird Equals aufgerufen, nachdem die Methode aufgelöst wurde?

Ich habe eine Klasse UserComplete, die Methoden GetAll und Equals und einige andere einschließlich eines Konstruktors, der ein Array von Objekten akzeptiert. UserComplete Erbt vom Benutzer. Die Benutzerklasse enthält die Methoden GetRows und Equals.

Equals ist nichts Besonderes:

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 

Und GetAll wandelt nur das Objekt()() aus der Datenbank oder Cache auf eine Liste von 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 

I GetAll von einem Service-Controller aufrufen und tatsächlich eine Antwort bekommen, kein Problem. Danach wird ein Breakpoint in Equals getroffen und obj ist eine List (Of Integers) mit einem Wert.

Wenn Sie dieses Verhalten erwarten würden, warum? Wenn nicht, können Sie erklären, warum es auftreten könnte und wie Sie es beheben können?

Antwort

0

Ok, ich habe einige Informationen, die als eine Antwort zählen können. Wenn jedoch jemand das "Warum" der Situation für die Gemeinschaft erklären kann, werde ich das als die Antwort markieren.

Ich habe einige Parallelität gelöst Ich musste helfen, dies vorübergehend zu debuggen (oder permanent abhängig davon, ob ich entscheide, dass diese Liste viel skalieren wird). Ich fand, dass die Equals-Methode fällt in den Call-Stack unter diesem

Sessions(u.Key) = DateTime.Now 

wo Sessions ist ein Dictionary (Of Benutzer, Datetime).

Also die einfache Antwort ist, dass bei der Zuweisung eines Werts zu einem Dictionary-Objekt System.Collections.Generic Bibliothek Anrufe Gleich auf jeden Schlüssel im Dictionary.

Verwandte Themen