当使用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的问题每当遇到一个委托减法运算符警告。
ReSharper的是发出此警告,因为多播委托减法可以有陷阱,它不是谴责语言功能完全。 幸运的是,这些陷阱是在边缘的情况下,你不可能遇到他们,如果你只是简单的插装事件。 有没有实现自己的更好的方式add
/ remove
处理,你只是爱留意了。
我建议降级ReSharper的警告级别为消息为“提示”,让你不会麻木到他们的警告,这通常是有用的。
你不应该直接使用委托来总结或删减。 相反,你的领域
MyHandler _myEvent;
应改为声明为事件也是如此。 这将解决,而不用担心您的解决方案的问题,但还是有事件的使用效益。
event MyHandler _myEvent;
委托金额或减去的使用是危险的,因为你可以失去的事件时,只需指派委托(根据声明,开发商不会直接推断出这是一个多播委托时,它被声明为事件作为)。 只是为了举例说明,如果在这个问题上所提到的财产不会被标记为一个事件,下面的代码将区分丢失两个的第一个任务,因为有人简单地分配给代表(这也是有效的!)。
myObject.MyEvent += Method1;
myObject.MyEvent += Method2;
myObject.MyEvent = Method3;
在分配方法3,我完全失去了两个初始订阅。 事件的使用将避免这个问题,并在同一时间删除ReSharper的警告。