È assolutamente necessario pulire il riferimento. Se ci fossero dubbi, potresti facilmente testare il tuo evento statico in questo modo.
static class MemoryLeak
{
static List<Action<int>> list = new List<Action<int>>();
public static event Action<int> ActivateLeak
{
add
{
list.Add(value);
}
remove
{
list.Remove(value);
}
}
}
Quindi, impostando un punto di interruzione nella funzione di rimozione si può vedere che il riferimento non è pulito.
class Program
{
static void Main(string[] args)
{
foo f = new foo();
MemoryLeak.ActivateLeak += o => f.bar();
f.tryCleanup();
}
}
class foo
{
public void bar()
{ }
public void tryCleanup()
{
MemoryLeak.ActivateLeak -= o => bar();
}
}
Come alternativa alla soluzione di Simon si potrebbe usare una seconda chiusura per creare un'azione di "staccare", che può essere passato in giro.
foo f = new foo();
Action<int> callfoo = o => f.bar();
MemoryLeak.ActivateLeak += callfoo;
Action cleanUp =() => MemoryLeak.ActivateLeak -= callfoo;
// Now you can pass around the cleanUp action and call it when you need to unsubscribe from the event.
cleanUp();
Mi piace lo stile di succinta qui. Per i miei bisogni, questo dovrebbe funzionare perfettamente. Grazie per aver dedicato del tempo per scrivere questo! – jschroedl