Gute Implementierung des schwachen Wörterbuchs in .Net
Wo finde ich eine gute Umsetzung von IDictionary
die verwendet schwache Referenzen drin?
Wörterbuch sollte mit ausschließlich schwachen verweisen auf Werte und schließlich bereinigen, die sich von Toten Referenzen.
Oder sollte ich einfach nur schreiben Sie es mir?
InformationsquelleAutor der Frage Konstantin Spirin | 2010-05-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
ConditionalWeakTable Klasse verwendet schwache Schlüssel automatisch und entfernt das Schlüssel/Wert-Eintrag, sobald keine weiteren Referenzen auf ein Schlüssel existieren, der außerhalb der Tabelle.
InformationsquelleAutor der Antwort madrang
Müssen Sie es selbst schreiben. Es sollte relativ gerade nach vorne, die Umsetzung der IDictionary-Schnittstelle und Speicherung der ist-Werte als WeakReferences. Sie können dann überprüfen Sie die Werte auf hinzufügen/auswählen, um zu sehen, ob Sie noch am Leben sind.
Pseudo-code - nicht wirklich kompilieren:
InformationsquelleAutor der Antwort Paul Alexander
Es ist eine Sache zu haben WeakReferences zu Werten, aber ich fand, dass das Dictionary der Schlüssel kann auch eine Quelle von Speicherlecks. Hier ist ein bare bones Umsetzung mit WeakReference Tasten:
InformationsquelleAutor der Antwort Kyle Lahnakoski
Ein problem mit dem blossen halten von a dictionary of WeakReference-Objekte ist, dass es keine Möglichkeit gibt, kurz die Aufzählung der gesamte Wörterbuch, das entfernen aus dem Wörterbuch alle WeakReference-Objekte, deren Ziele außerhalb des Bereichs.
Wäre es hilfreich, wenn eine WeakReference könnte einen Delegierten, der würde aufgerufen werden, wenn das primäre Ziel ging out of scope. Soweit ich weiß, gibt es keine Möglichkeit, das zu tun. Wenn Sie nichts dagegen haben, das hinzufügen eines weiteren Feldes und ein wenig code, um die Objekte, die Sie speichern in Ihrem "schwachen Wörterbuch", würde ich vorschlagen, das zu schaffen, was ich nenne eine "Finasposer" - Objekt, dessen einzige Feld ist ein MethodInvoker; wenn entsorgt, die MethodInvoker sollte genullt; der finalizer sollten Verzahnt.Exchange() die MethodInvoker auf null und-wenn die alte Wert war nicht null--es aufzurufen. Das Objekt geschrieben werden, in das Wörterbuch sollte erstellen Sie einen neuen Finasposer Objekt, mit einer Stellvertretung, die bewirken, dass der Schlüssel werden aus dem Wörterbuch entfernt werden, wenn bequem.
Beachten Sie, dass das weder der finalizer noch alle Delegierten aufgerufen, dabei sollte nie direkt bearbeitet werden, das Wörterbuch, noch irgendetwas tun, das würde erfordern den Erwerb einer Sperre. Wenn die Finasposer hält delegieren, delegieren, selbst ist garantiert gültig, wenn Finalize ausgeführt wird, aber das Objekt angebracht, um den Delegierten und alle Objekte, die referenziert werden dadurch, kann in unerwartete Zustände. Es sollte sicher sein, aber für die Finasposer genannte Methode hinzufügen, um eine verknüpfte Liste eine Referenz auf das Objekt, das ging out-of-scope. Das Wörterbuch Hinzufügen, Entfernen und andere Methoden könnten eine Umfrage der verknüpften Liste, um zu sehen, wenn eine der WeakReferences darin gestorben und musste gereinigt werden.
InformationsquelleAutor der Antwort supercat
Wenn Identität-Vergleich kann nicht verwendet werden, dann ConditionalWeakTable ist keine option.
In diesem Fall, ich wage zu unserer Umsetzung
WeakTable.cs
und unsere Beschreibung im blog
WeakTable.
InformationsquelleAutor der Antwort Vladimir Nesterovsky