Ich habe eine Klasse, die sich an einen Delegierten hält, um später etwas zu bewerten.
Sobald ich es ausgewertet habe, indem ich den Delegierten aufrufe, lösche ich den Verweis auf den Delegierten, in der Hoffnung, dass er für die Sammlung infrage kommt. Schließlich könnte es an einer Welt lokaler Variablen festhalten, wenn es als anonyme Methode konstruiert wurde.
Ich habe versucht, einen Komponententest zu erstellen, um dies zu überprüfen, aber es scheint nicht so zu funktionieren, wie ich es geplant habe, stattdessen scheinen meine Annahmen über WeakReference
(die ich hier zu Testzwecken verwendet habe), oder eine andere Annahme, hält nicht Wasser.
Sehen Sie sich diesen Code an, den Sie in LINQPad
ausführen können %Vor%Ich ging davon aus:
WeakReference
und den Lazy<T>
Objekten Lazy<T>
auffordern, seinen Verweis auf den Delegaten aufzugeben, würde dies die Referenzen auf nur denjenigen reduzieren, den WeakReference
an WeakReference
übrig bleibt.
WeakReference
würde anzeigen, dass das Objekt nicht mehr lebt Die Ausgabe des Codes wurde somit erwartet (mit Kommentaren):
%Vor%Aber stattdessen ist die Ausgabe:
%Vor%Kann jemand etwas Licht auf das werfen, was ich hier vermisse?
Das "Problem" ist, dass der Compiler bemerkt, dass er eine einzelne Delegierteninstanz für immer wiederverwenden kann. Es erfasst keinen Kontext, nicht einmal den impliziten Verweis this
. Also das:
Wird zu etwas wie:
gemacht %Vor%Sehen Sie sich den Code in ildasm (oder Reflector ohne aktivierte Optimierung) an, um genau zu sehen, was gerade passiert.
Tags und Links .net c# garbage-collection delegates