Прямо к кодуСтранный эффект закрытия C# на сборщика мусора
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();
});
}
}
Выходом я получаю от этого кода
False
True
Как на земле это возможно?
P.S. Я вошел в это, пытаясь понять, как работает WeakEventManager
.
Является ли эта деталь реализации, или это поведение указано (подразумевается) в документации где-нибудь? – ironic
@ironic: факт, что он * делает *, является деталью реализации. Тот факт, что он * может * произойти, находится в спецификации. (В нем говорится, что один и тот же делегат может быть использован повторно). –