Ваша ситуация в порядке; событие подписчик не помешает сбору издателя , но может произойти обратное.
Например,
class Foo
{
public event EventHandler FooEvent;
void LeakMemory()
{
Bar bar = new Bar();
bar.AttachEvent(this);
}
}
class Bar
{
void AttachEvent(Foo foo)
{
foo.FooEvent += (sender, e) => { };
}
}
В этом случае экземпляр Bar
, созданный в LeakMemory
, не может быть собран до
- Анонимный метод, представленный лямбда-выражением, удален из списка вызовов
FooEvent
- Экземпляр Foo, к которому он прикреплен, может быть собран
Это потому, что событие (которое является просто некоторым синтаксическим сахаром по сравнению с обычным delegate
экземпляром) хранится в списке делегатов, которые нужно вызвать при его вызове, и каждый из этих делегатов, в свою очередь, имеет ссылку на объект к которому он прикреплен (в данном случае, экземпляр Bar
).
Обратите внимание, что речь идет только о коллекции eligibility здесь. Просто потому, что он имеет право, ничего не говорится о , когда (или даже, на самом деле, , если ) он будет собран, просто о том, что может быть.