Frage

Ich habe geerbt vor kurzem eine Anwendung, die sehr starke Nutzung von Session macht, darunter eine Menge von benutzerdefinierten Datenobjekten in der Sitzung zu speichern. Einer meiner ersten Punkte des Geschäfts mit dieser Anwendung war zumindest auf die Sitzungsdaten weg von InProc zu bewegen, und laden Sie es aus, um entweder eine State oder SQL Server.

Nachdem ich alle der entsprechenden Daten aus Objekten serializable, und änderte die web.config einen Zustand Service zu nutzen, schien alles gut zu funktionieren.

Allerdings fand ich, dass diese Anwendung eine Menge von Objektvergleiche funktioniert mit GetHashCode (). Methoden, die gut funktioniert, wenn die Sitzung war InProc nicht mehr funktionieren, weil die Hashcodes nicht mehr übereinstimmen, wenn sie sollen. Dies scheint der Fall zu sein, wenn ein bestimmtes Kind-Objekt von einem Elternteil zu finden versuchen, wenn Sie das Kind Objekt ursprünglichen Hash-Code

kennen

Wenn ich einfach die web.config mit inproc ändern zurück, es funktioniert wieder.

Wer noch keine Gedanken darüber, wo damit beginnen?


EDIT:

qbeuek: vielen Dank für die schnelle Antwort. In Bezug auf:

  

Die Standardimplementierung von GetHashCode in Objektklasse gibt einen Hash-Wert basierend auf Objekte Adresse im Speicher oder etwas ähnliches. Wenn eine andere Identität Vergleich erforderlich ist, müssen Sie beide Equals außer Kraft setzen und GetHashCode.

Ich habe mehr Informationen zu gegeben, wie sie diese verwenden. Grundsätzlich haben sie ein Elternteil Datenobjekt, und es gibt mehrere Arrays von Child-Objekten. Sie passieren den Hash-Code für ein bestimmtes Objekt zu wissen, dass sie brauchen, damit sie Looping durch eine spezielle Anordnung von untergeordneten Objekten für einen Hash-Code suchen, der übereinstimmt. Sobald eine Übereinstimmung gefunden wird, verwenden sie dann das Objekt für andere Arbeiten.

War es hilfreich?

Lösung

Wenn Sie schreiben

  

tut viel Objektvergleiche mit GetHashCode ()

Ich habe das Gefühl es ist etwas schrecklich falsch mit diesem Code ist. Die GetHashCode-Methode ist keine Garantie, dass die zurückgegebenen Hash-Werte in irgendeiner Weise einzigartig zwei verschiedene Objekte gegeben sein sollten. Soweit GetHashCode betrifft, so kann es für alle Objekte zurückgeben 0 und noch korrekt berücksichtigt werden.

Wenn zwei Objekt gleich sind (die Equals-Methode true zurückgibt), sie muss haben den gleichen Wert von GetHashCode zurückgegeben. Wenn zwei Objekte den gleichen Hash-Wert haben, sie können sein das gleiche Objekt (Equals kehrt true) oder andere Objekte sein (Equals gibt false zurück).

Es gibt keine weiteren Garantien auf dem Ergebnis des GetHashCode.

Die Standardimplementierung von GetHashCode in Objektklasse gibt einen Hash-Wert basierend auf Objekte Adresse im Speicher oder etwas ähnliches. Wenn eine andere Identität Vergleich erforderlich ist, können Sie auf müssen die beiden Equals außer Kraft setzen und GetHashCode.

Andere Tipps

Überschreiben Sie die GetHashCode-Methode in Klassen, die diese Methode und Berechnung des Hash-Code basiert auf einzigartigen Objekteigenschaften (wie ID oder alle Objektfelder) aufgerufen.

Lösung 1: Erstellen Sie eine eindeutige ID für alle untergeordneten Objekte und verwenden, die anstelle von Hash-Code

.

Lösung 2: Ersetzen Sie if (a.GetHashCode () == b.GetHashCode ()) mit if (a.Equals (b))

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top