“代表减法具有不可预知的后果”,在ReSharper的/ C#?(“Delegate subtrac

2019-06-25 17:20发布

当使用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
    }
}

Answer 1:

不要害怕! ReSharper的警告的第一部分仅适用于去除代表的名单。 在代码中,你始终在卸下一个代表。 除去有关委托的顺序重复委托后,第二部分会谈。 事件不保证执行顺序为它的用户,所以它并没有真正影响你要么。

由于上述机制可能会导致不可预测的结果,ReSharper的问题每当遇到一个委托减法运算符警告。

ReSharper的是发出此警告,因为多播委托减法可以有陷阱,它不是谴责语言功能完全。 幸运的是,这些陷阱是在边缘的情况下,你不可能遇到他们,如果你只是简单的插装事件。 有没有实现自己的更好的方式add / remove处理,你只是爱留意了。

我建议降级ReSharper的警告级别为消息为“提示”,让你不会麻木到他们的警告,这通常是有用的。



Answer 2:

你不应该直接使用委托来总结或删减。 相反,你的领域

MyHandler _myEvent;

应改为声明为事件也是如此。 这将解决,而不用担心您的解决方案的问题,但还是有事件的使用效益。

event MyHandler _myEvent;

委托金额或减去的使用是危险的,因为你可以失去的事件时,只需指派委托(根据声明,开发商不会直接推断出这是一个多播委托时,它被声明为事件作为)。 只是为了举例说明,如果在这个问题上所提到的财产不会被标记为一个事件,下面的代码将区分丢失两个的第一个任务,因为有人简单地分配给代表(这也是有效的!)。

myObject.MyEvent += Method1; 
myObject.MyEvent += Method2;
myObject.MyEvent = Method3;

在分配方法3,我完全失去了两个初始订阅。 事件的使用将避免这个问题,并在同一时间删除ReSharper的警告。



Answer 3:

其设置为= NULL,而不是使用 - =



文章来源: “Delegate subtraction has unpredictable result” in ReSharper/C#?