Es beantwortet für mich viele Fragen/Probleme. Leider scheine ich ein Problem zu haben, auf das ich weiterhin stoße, und konnte keine gute Antwort darauf finden.
Angenommen, ich habe eine Methode (unten als Testmethode bezeichnet), bei der ich eine ConditionalWeakTable verwende, aber anstatt eine einzelne Referenz für den Schlüssel zu verwenden, muss ich stattdessen zwei Elemente kombinieren und daraus den Schlüssel machen. Dies wird unten anhand eines Key-Objekts gezeigt (das zu Demonstrationszwecken und zur Vereinfachung einfach ein erweitertes Tupel ist):
Code: Select all
[Fact]
public void TupleKey()
{
var first = new object();
var table = new ConditionalWeakTable();
var context = table.GetValue( new Key( first, new object() ), key => new object() );
// .. table has one entry here.
GC.Collect();
GC.WaitForPendingFinalizers();
Debugger.Break(); // Table is empty here.
}
class Key : Tuple
{
public Key( object item1, object item2 ) : base( item1, item2 ) {}
}
Da es jedoch einen aktiven Verweis auf einen der Teile des Schlüssel-Objekts gibt, möchte ich, dass der Eintrag in der ConditionalWeakTable ebenfalls aktiv bleibt und aktiv bleibt, bis alle seine untergeordneten/inneren Verweise beansprucht werden.
(Beim Nachdenken darüber und möglicher Lösungen wäre es fantastisch, wenn Es gab ein WeakHashSet, das irgendwie als Schlüssel für ein Wörterbuch verwendet werden konnte, aber bei einiger Suche scheint es nicht, dass ein WeakHashSet in .NET existiert.)
Hoffentlich beschreibt dies mein Dilemma. Im Grunde möchte ich eine ConditionalWeakTable (oder ein Äquivalent) verwenden, um einen zugehörigen Wert (als Schlüssel/Wert-Eintrag) zu speichern, aber anstatt eine (schwache) Referenz als Schlüssel für den Eintrag zu verwenden, möchte ich zwei (oder mehr) verwenden.
Ist das, was ich erreichen möchte, möglich (das heißt, ohne eine nennenswerte Menge an benutzerdefiniertem Code schreiben zu müssen)?
Mobile version