Gerade auf den Codemerkwürdige Wirkung von C# Schließungen auf Garbage Collector
class Program
{
private static WeakReference<EventHandler<EventArgs>> _noClosure;
private static WeakReference<EventHandler<EventArgs>> _closure;
static void Main(string[] args)
{
Init();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
EventHandler<EventArgs> target;
Console.WriteLine(_closure.TryGetTarget(out target));
Console.WriteLine(_noClosure.TryGetTarget(out target));
}
class C { public void Go() { } }
private static void Init()
{
_noClosure = new WeakReference<EventHandler<EventArgs>>((sender, args) =>
{
});
var s = new C();
_closure = new WeakReference<EventHandler<EventArgs>>((sender, args) =>
{
s.Go();
});
}
}
Der Ausgang ich von diesem Code erhalten, ist
False
True
Wie auf der Erde ist das möglich?
P.S. Ich kam dazu, während ich versuchte herauszufinden, wie WeakEventManager
funktioniert.
Ist dies ein Implementierungsdetail, oder wird dieses Verhalten irgendwo in der Dokumentation angegeben? – ironic
@ironic: Die Tatsache, dass es * passiert * ist ein Implementierungsdetail. Die Tatsache, dass es passieren kann, ist in der Spezifikation. (Es besagt, dass derselbe Delegat trotzdem wiederverwendet werden kann.) –