Ответ
Да, если подписка была создана, и объект подписчик живет дольше издателя. Иначе может возникнуть утечка памяти, так как издатель будет держать ссылку на подписчика.
Пример:
public class Publisher
{
public event EventHandler SomethingHappened;
}
public class Subscriber
{
public void Subscribe(Publisher publisher)
{
publisher.SomethingHappened += OnSomethingHappened;
}
public void Unsubscribe(Publisher publisher)
{
publisher.SomethingHappened -= OnSomethingHappened;
}
private void OnSomethingHappened(object sender, EventArgs e) { }
}
Когда отписываться:
- Если подписчик — временный объект (например, ViewModel в UI).
- Если подписка создана в конструкторе или методе инициализации.
Исключение: Статические события или подписка на короткоживущие объекты, где утечка маловероятна.
Ответ 18+ 🔞
А, ну это классика, блядь! Прямо в точку. Смотри, если ты создал подписку, а твой подписчик живёт дольше издателя — это пиздец, а не ситуация. Издатель-то будет держать ссылку на подписчика, как будто это его последняя надежда, и не отпустит, пока его самого в сборщик мусора не отправят. Вот тебе и утечка памяти, ебать колотить.
Вот смотри на этот код, тут всё как на ладони:
public class Publisher
{
public event EventHandler SomethingHappened;
}
public class Subscriber
{
public void Subscribe(Publisher publisher)
{
publisher.SomethingHappened += OnSomethingHappened;
}
public void Unsubscribe(Publisher publisher)
{
publisher.SomethingHappened -= OnSomethingHappened;
}
private void OnSomethingHappened(object sender, EventArgs e) { }
}
Так когда же отписываться, спросишь ты? Да в общем-то почти всегда, если не хочешь потом искать, куда у тебя память девается!
- Если твой подписчик — это какая-нибудь временная хрень, вроде ViewModel в каком-нибудь UI-приложении. Закрыл окно — отписался, иди нахуй. А то оно будет висеть в памяти, как призрак, и ждать своего события, которое уже никогда не придёт.
- Или если ты навесил подписку в конструкторе или в методе
Initialize. Ну логично же, блядь: раз подписался при рождении, отпишись при смерти. В деструкторе или в методе очистки. Порядок должен быть во всём, ёпта.
Хотя есть, конечно, исключения, да. Ну там, статические события — они же живут вечно, пока домен приложения не выгрузится, тут уж ничего не поделаешь. Или если подписываешься на объект, который явно переживёт тебя в сто раз — ну, допустим, на какой-нибудь глобальный логгер. Но это надо семь раз подумать, один раз подписаться, и всё равно волноваться, блядь. В общем, правило простое: не отписался — считай, накосячил.