pro*_*mer 137 .net c# events delegates
参加以下C#课程:
c1 {
event EventHandler someEvent;
}
Run Code Online (Sandbox Code Playgroud)
如果有很多订阅c1的someEvent事件,我想清除所有这些,那么实现这一目标的最佳方法是什么?还要考虑对此事件的订阅可以是lambdas/anonymous delegates.
目前我的解决方案是添加一个ResetSubscriptions()方法,将c1其设置someEvent为null.我不知道这是否有任何看不见的后果.
Jon*_*eet 176
在类中,您可以将(hidden)变量设置为null.空引用是有效地表示空调用列表的规范方式.
从课外,你不能这样做 - 事件基本上暴露"订阅"和"取消订阅",就是这样.
值得注意的是,类似字段的事件实际上是在做什么 - 它们同时创建变量和事件.在类中,您最终引用变量.从外面,您可以参考该活动.
有关更多信息,请参阅我关于事件和代理的文章.
pro*_*mer 32
向c1添加一个方法,将'someEvent'设置为null ...
class c1
{
event EventHandler someEvent;
ResetSubscriptions() {someEvent = null;}
}
Run Code Online (Sandbox Code Playgroud)
小智 7
class c1
{
event EventHandler someEvent;
ResetSubscriptions() {someEvent = delegate{};}
}
Run Code Online (Sandbox Code Playgroud)
使用委托{}比使用null更好
清除所有订阅者的最佳做法是,如果要将此功能公开给外部,可以通过添加另一个公共方法将someEvent设置为null.这没有任何看不见的后果.前提条件是记住使用关键字"event"声明SomeEvent.
请参阅书籍 - 简言之C#4.0,第125页.
这里有人建议使用Delegate.RemoveAll方法.如果您使用它,示例代码可以遵循以下形式.但这真的很愚蠢.为什么不只是SomeEvent=null里面ClearSubscribers()的功能?
public void ClearSubscribers ()
{
SomeEvent = (EventHandler) Delegate.RemoveAll(SomeEvent, SomeEvent);// Then you will find SomeEvent is set to null.
}
Run Code Online (Sandbox Code Playgroud)