Событие отмены подписки / повторной подписки во избежание утечки памяти - PullRequest
0 голосов
/ 28 июня 2018

Я вижу много кода, подобного этому в нашей кодовой базе:

void Method()
{
     this.someObject.SomeEvent -= someHandler;
     this.someObject.SomeEvent += someHandler;
     //... other stuff
}

Это когда-нибудь полезно? Я продолжаю давать исполнителю преимущество сомнения, думая, что, возможно, что-то пропустил.

Я бы понял намерение избежать утечек памяти, если бы код был похож на:

void Method()
{
     this.someObject.SomeEvent -= someHandler;
     this.someObject = new WhateverClass();
     this.someObject.SomeEvent += someHandler;
     //... other stuff
}

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

первый подход действителен только в том случае, если вы хотите подтвердить отсутствие дублированных подписок, связанных с одним и тем же событием. Если вы вызываете метод () много раз в своем алгоритме, а someHandler только добавляется и никогда не удаляется из подписчиков, то ваш обратный вызов someHandler будет вызываться много раз. Это единственный риск.

В связи с утечками памяти ваши рассуждения идеальны. Эта статья объясняет тему утечки памяти. https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/events/how-to-subscribe-to-and-unsubscribe-from-events

Хорошего дня

0 голосов
/ 28 июня 2018

Первый пример - это попытка остановить несколько подписок, которая может вызвать проблемы (и утечку), а второй - попытка остановить утечку памяти

Однако вы можете использовать такой шаблон, который имеет свои преимущества, а не пуленепробиваемый способ остановить утечку (т. Е. Я просто помогаю при вычитании, что нет нескольких подписок и что вы не подписались не раз), но это сводит на нет всю эту сложность / вычитание, происходящее

private EventHandler _stuff;

public event EventHandler Stuff
{
   add
   {
      if (_stuff== null || !_stuff.GetInvocationList().Contains(value))
         _stuff+= value;
   }
   // ignore the resharper warning
   remove => _stuff -= value;
}

Хотя на самом деле, если вы хотите использовать шаблон событий, вы должны хорошо знать, когда вам нужно подписаться и отписаться, если нет, у вас есть большие проблемы.

Лично я предпочитаю Отделенные сообщения / Агрегатор событий (тип публикации / подтипа). Я редко нарочно создаю мероприятия сантехники в эти дни.

...