Нужно ли отписываться от события

Ответ

Да, если подписка была создана, и объект подписчик живет дольше издателя. Иначе может возникнуть утечка памяти, так как издатель будет держать ссылку на подписчика.

Пример:

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. Ну логично же, блядь: раз подписался при рождении, отпишись при смерти. В деструкторе или в методе очистки. Порядок должен быть во всём, ёпта.

Хотя есть, конечно, исключения, да. Ну там, статические события — они же живут вечно, пока домен приложения не выгрузится, тут уж ничего не поделаешь. Или если подписываешься на объект, который явно переживёт тебя в сто раз — ну, допустим, на какой-нибудь глобальный логгер. Но это надо семь раз подумать, один раз подписаться, и всё равно волноваться, блядь. В общем, правило простое: не отписался — считай, накосячил.