ReSharper / C#中的“委托减法有不可预知的结果”?

当使用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警告的第一部分仅适用于删除代表名单。 在你的代码中,你总是删除一个委托。 第二部分讨论了删除重复代表之后委托人的sorting。 一个事件并不能保证订阅者的执行顺序,所以它也不会影响你。

由于上述机制可能会导致不可预知的结果,因此ReSharper遇到委托减法运算符时会发出警告。

ReSharper发出这个警告是因为组播委托减法会有陷阱,而不是完全谴责那个语言特性。 幸运的是,那些陷阱是在边缘情况下,如果你只是简单的事件,你不太可能遇到它们。 没有更好的方法来实现你自己的add / remove处理程序,你只需要注意。

我build议将ReSharper的警告级别降级为“提示”,这样你就不会对他们的警告感到不敏感,这通常是有用的。

你不应该直接使用代表来总结或减less。 而不是你的领域

 MyHandler _myEvent; 

应该改为声明为事件。 这将解决问题而不会冒你的解决scheme的风险,并仍然有事件使用的好处。

 event MyHandler _myEvent; 

委托总和或减法的使用是危险的,因为当简单地分配委托时(如声明,开发人员不会直接推断这是一个多播委托,因为当它被声明为一个事件时)可能会丢失事件。 只是为了举例说明,如果在这个问题上提到的财产没有被标记为一个事件,下面的代码将案件的两个第一个任务是失败,因为有人简单地分配给代表(这也是有效的!)。

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

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

将其设置为= null而不是使用 – =