Se eu tiver o seguinte código:
MyClass pClass = new MyClass();
pClass.MyEvent += MyFunction;
pClass = null;
O pClass será coletado como lixo? Ou ele continuará disparando seus eventos sempre que eles ocorrerem? Preciso fazer o seguinte para permitir a coleta de lixo?
MyClass pClass = new MyClass();
pClass.MyEvent += MyFunction;
pClass.MyEvent -= MyFunction;
pClass = null;
c#
.net
event-handling
garbage-collection
Mark Ingram
fonte
fonte
Respostas:
Para a pergunta específica "O pClass será coletado de lixo": a assinatura do evento não afeta a coleta do pClass (como o editor).
Para o GC em geral (em particular, o destino): depende se MyFunction é estático ou baseado em instância.
Um delegado (como uma assinatura de evento) para um método de instância inclui uma referência à instância. Então, sim, uma assinatura de evento impedirá o GC. No entanto, assim que o objeto que publica o evento (pClass acima) é elegível para coleta, isso deixa de ser um problema.
Observe que isso é unidirecional; ou seja, se tivermos:
o "editor" manterá o "alvo" ativo, mas o "alvo" não manterá o "editor" ativo.
Portanto, não: se o pClass for coletado de qualquer maneira, não há necessidade de cancelar a inscrição dos ouvintes. No entanto, se pClass foi longa vida (mais do que a instância com MyFunction), então pClass poderia manter essa instância vivo, por isso iria ser necessário cancelar a inscrição se deseja que o alvo a ser coletado.
Eventos estáticos, no entanto, por esse motivo, são muito perigosos quando usados com manipuladores baseados em instância.
fonte
WeakReference
, e em alguns casos, uma boa ideia, mas sempre que não for forte.Sim, o pClass será coletado como lixo. A assinatura do evento não implica que exista qualquer referência a pClass.
Portanto, você não precisará desanexar o manipulador para que o pClass seja coletado.
fonte
No momento em que um pedaço de memória não é mais referenciado, ele se torna um candidato à coleta de lixo. Quando a instância da sua classe sai do escopo, ela não é mais referenciada pelo seu programa. Não é mais usado e, portanto, pode ser coletado com segurança.
Se você não tem certeza se algo será coletado, faça a si mesmo a seguinte pergunta: ainda existe uma referência a ele? Os manipuladores de eventos são referenciados pela instância do objeto, e não o contrário.
fonte
pClass
será coletado lixo. No entanto, se o trecho de código acima é dentro de outra classe, a instância dessa classe pode não ser apagada se você não definirpClass
anull
.fonte