При использовании myDelegate -= eventHandler
ReSharper (версия 6) возникают следующие проблемы:
Вычитание делегата имеет непредсказуемый результат
Причина этого объясняется здесь JetBrains . Объяснение имеет смысл, и, прочитав его, я сомневаюсь в том, что я использую его для -
делегатов.
Как тогда ,
- Могу ли я написать неавтоматическое событие, не сделав ReSharper сварливым?
- или есть лучший и / или «правильный» способ реализовать это?
- или я могу просто игнорировать ReSharper?
Вот упрощенный код:
public delegate void MyHandler (object sender);
MyHandler _myEvent;
public event MyHandler MyEvent
{
add
{
_myEvent += value;
DoSomethingElse();
}
remove
{
_myEvent -= value; // <-- ReSharper warning here
}
}
Ответы:
Не бойся! Первая часть предупреждения ReSharper касается только удаления списков делегатов. В вашем коде вы всегда удаляете одного делегата. Во второй части рассказывается об упорядочивании делегатов после удаления дублирующего делегата. Событие не гарантирует порядок выполнения для своих подписчиков, поэтому на вас оно тоже не влияет.
ReSharper выдает это предупреждение, потому что вычитание многоадресного делегата может иметь проблемы, и он не осуждает полностью эту языковую функцию. К счастью, эти подводные камни бывают в крайних случаях, и вы вряд ли столкнетесь с ними, если вы просто инструментируете простые события. Нет лучшего способа реализовать свои собственные
add
/remove
обработчики, вы просто должны заметить.Я бы посоветовал понизить уровень предупреждений ReSharper для этого сообщения до «Подсказка», чтобы вы не теряли чувствительность к их предупреждениям, которые обычно полезны.
источник
Delegate
никак не перегружать+
и-
.)PIT OF SUCCESS IS THAT WAY --->
.Delegate.Combine
который «выравнивает» многоадресные делегаты, поэтому, если ему даны делегаты [X, Y] и Z, он не может определить, должен ли результат быть [X, Y, Z] или [[ X, Y], Z] (последний делегат хранит[X,Y]
делегат как свойTarget
, аInvoke
метод этого делегата - как свойMethod
).Вы не должны напрямую использовать делегаты для суммирования или вычитания. Вместо твоего поля
Вместо этого следует также объявить как событие. Это решит проблему, не рискуя своим решением, и при этом останется преимущество использования событий.
Использование делегата суммы или вычитания опасно, потому что вы можете потерять события при простом назначении делегата (согласно объявлению, разработчик не будет напрямую делать вывод, что это делегат Multicast, как когда он объявлен как событие). Чтобы проиллюстрировать это, если свойство, упомянутое в этом вопросе, не было помечено как событие, в приведенном ниже коде два первых назначения будут LOST, потому что кто-то просто назначен делегату (что также верно!).
При назначении Method3 я полностью потерял две начальные подписки. Использование события позволит избежать этой проблемы и в то же время удалить предупреждение ReSharper.
источник
установите для него значение = null вместо использования - =
источник
remove
метод события не следует удалить все обработчик, а обработчик , что было предложено быть удален.