Часто я нахожу, что пишу код следующим образом:
if (Session != null)
{
Session.KillAllProcesses();
Session.AllUnitsReady -= Session_AllUnitsReady;
Session.AllUnitsResultsPublished -= Session_AllUnitsResultsPublished;
Session.UnitFailed -= Session_UnitFailed;
Session.SomeUnitsFailed -= Session_SomeUnitsFailed;
Session.UnitCheckedIn -= Session_UnitCheckedIn;
UnattachListeners();
}
Цель состоит в том, чтобы очистить все подписки на события, которые мы зарегистрировали для целевого (сеанса), чтобы сеанс был свободен для размещения в GC. У меня была дискуссия с коллегой о классах, которые реализуют IDisposable, но это было его убеждение в том, что эти классы должны предварительно выполнить очистку следующим образом:
/// <summary>
/// Disposes the object
/// </summary>
public void Dispose()
{
SubmitRequested = null; //frees all references to the SubmitRequested Event
}
Есть ли причина для предпочтения одного над другим? Есть ли лучший способ это сделать? (Помимо слабых опорных событий всюду)
То, что я действительно хотел бы видеть, похоже на шаблон безопасного вызова для поднятия событий: безопасный и повторяемый. Что-то, что я могу запомнить каждый раз, когда я прикрепляю к событию, чтобы я мог убедиться, что мне будет легко очистить.