清除事件的优雅方式

时间:2010-10-26 13:08:11

标签: c#

我正在实现一个Buthon_Click方法,顾名思义它正在用一个事件onclick button.Now为了这个方法做我想要的事情我需要清除/取消绑定/取消订阅附加到{{1的委托问题是我想要这样做而不关心以前连接过哪种方法。 举个例子:

SystemEvents.SessionSwitch

所以我现在正在做的是创造一个foreach并经历所有可能性 - 整体上4个:

SystemEvents.SessionSwitch += new SessionSwitchEventHandler(Methodx);

我发现这段代码的安静有点麻烦和尴尬,我想知道是否有一种更“优雅”的方式来做这样的事情,如int [] array={1,2,3,4}; foreach (int n in array) { SystemEvents.SessionSwitch -= new SessionSwitchEventHandler(SystemEvents_SessionSwitch1); SystemEvents.SessionSwitch -= new SessionSwitchEventHandler(SystemEvents_SessionSwitch2); SystemEvents.SessionSwitch -= new SessionSwitchEventHandler(SystemEvents_SessionSwitch3); SystemEvents.SessionSwitch -= new SessionSwitchEventHandler(SystemEvents_SessionSwitch4); } 或类似的东西会消灭所有连接的方法?

提前致谢

2 个答案:

答案 0 :(得分:2)

这取决于谁“拥有”SystemEvents.SessionSwitch。通常,从外部您无法设置事件处理程序列表 - 您只能添加或删除它们。这就是封装的程度。

您应该区分事件和可能恰好是事件的后备存储的任何变量。事件仅支持订阅和删除。有关详细信息,请参阅我的article on events and delegates

请注意,您现有的代码可能会更加整洁:

foreach (int n in array)
{
    SystemEvents.SessionSwitch -= SystemEvents_SessionSwitch1;
    SystemEvents.SessionSwitch -= SystemEvents_SessionSwitch2;
    SystemEvents.SessionSwitch -= SystemEvents_SessionSwitch3;
    SystemEvents.SessionSwitch -= SystemEvents_SessionSwitch4;
}

...虽然你在这里没有使用n,但是你为什么要循环却不是很清楚。

答案 1 :(得分:0)

除了代表之外设置事件的一个特征(除其他外)是对 + =和 - =仅限于外人的限制。如果您不拥有该事件,则不能对除此之外的事件执行任何其他操作。

拥有该事件的班级可以做:

SystemEvents.SessionSwitch==null; // only allowable to the owner of SessionSwitch