Ho il seguente codice nella mia classeÈ possibile utilizzare l'assegnazione di uguali quando si rimuovono membri delegati in un metodo di smaltimento?
public class Receiver : IReceiver
{
public event EventHandler Received;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
if (Received != null)
{
foreach (EventHandler delegateMember in Received.GetInvocationList())
{
Received -= delegateMember;
}
}
}
}
}
Questo codice funziona in che quando mi dispongo la mia classe tutti gli eventi che sono collegati alla manifestazione Ricevuto, saranno rimossi singolarmente.
mi sono chiesto se, piuttosto che essere così verbose a questo proposito, se la seguente versione concisa avrà lo stesso effetto
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
Received = null;
}
}
Fondamentalmente questo si riduce a come i sovraccarichi operatore sono stati creati da Microsoft quando implementare i sovraccarichi dei delegati. So che tutta la documentazione dice di usare + = per iscriversi e - = per annullare l'iscrizione a un evento. Ho anche visto il documento dire che l'evento verrà assegnato a null quando l'ultimo utente viene rimosso. Ciò che la documentazione non dice è se l'assegnazione dell'evento a null, avrà l'effetto di annullare la sottoscrizione di tutti gli eventi?
Mi piacerebbe sapere se questo è possibile, e se c'è qualche documentazione che dice che l'eventuale codice terse è un comportamento corretto.
Aggiornamento:
Ho fatto un po 'scavare con il compilatore C# e hanno trovato che l'assegnazione su null funziona solo all'interno della classe in cui è definito l'evento. + = E - = è sempre disponibile sia all'interno che all'esterno della classe. Questo mi porta a pensare che usare la versione = null sia accettabile. Tuttavia, questa è una speculazione, non ho ancora visto alcuna documentazione che dichiari esplicitamente che questa è una funzionalità supportata.
@DStanley I delegati farebbero ancora riferimento a tali oggetti, sì, ma il delegato stesso non verrebbe più rootato o accessibile da una radice, quindi non manterrebbe vivi quegli oggetti di riferimento. – Servy
Ho controllato per un po 'di tempo prima di pubblicare la domanda. Bascialmente la domanda sta usando = versi usando - =. Nel MSDN il più vicino che riesco a trovare è in fondo a questa pagina https://msdn.microsoft.com/en-us/library/ms366768(v=vs.90).aspx dice che il null verrà assegnato quando l'ultima istanza del gestore eventi è stata annullata. –