Ist es möglich, ConditionalWeakTable mit einem Tuple-Schlüssel (oder einem Schlüssel, der aus mehreren Referenzen bestehC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Ist es möglich, ConditionalWeakTable mit einem Tuple-Schlüssel (oder einem Schlüssel, der aus mehreren Referenzen besteh

Post by Anonymous »

Ich bin ein großer Fan der ConditionalWeakTable. Es ist wirklich ganz toll. Es ermöglicht Ihnen im Wesentlichen, eine Referenz mit einer anderen Referenz zu verknüpfen/anzuhängen/zu koppeln, und das alles bei gleichzeitiger Thread-Sicherheit.
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 ) {}
}
Wenn Debugger.Break aufgerufen wird, ist die ConditionalWeakTable leer, obwohl in der Testmethode ein aktiver Verweis auf einen der Teile des Schlüssels vorhanden ist. Dies ist sinnvoll, da der Verweis auf den Schlüssel nirgendwo im Test zu finden ist.
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)?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post