Direttamente al codicestrano effetto di C# chiusure su 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();
});
}
}
L'uscita che ricevo da questo codice è
False
True
Come diavolo è possibile?
P.S. Sono venuto in questo mentre cercavo di capire come funziona WeakEventManager
.
Si tratta di un dettaglio di implementazione, o che il comportamento è indicato (implicito) nella documentazione da qualche parte? – ironic
@ironic: il fatto che * * * avvenga è un dettaglio di implementazione. Il fatto che * possa * accadere è nelle specifiche. (Dice che lo stesso delegato può essere riutilizzato, comunque). –