2010-10-26 131 views
2

我正在實施一個Buthon_Click方法,顧名思義,它正在與事件onclick按鈕一起使用。現在爲了這個方法做我想要的,我需要清除/取消綁定/取消訂閱委託附加到SystemEvents.SessionSwitch事件。問題是,我想這樣做,而不關心之前已經連接了哪種方法。 舉一個例子:清除事件的優雅方式

SystemEvents.SessionSwitch += new SessionSwitchEventHandler(Methodx); 

所以我在做什麼,現在正在創造一個foreach,並通過一切可能去 - 4條:

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); 
} 

我找到的代碼有點麻煩和尷尬這種和平,我想知道是否有更「優雅」的方式來做這件事,比如SystemEvents.SessionSwitch == null或類似的東西會消滅所有連接的方法?

在此先感謝

回答

2

這取決於誰 「擁有」 SystemEvents.SessionSwitch。一般來說,從外部你不能設置事件處理程序的列表 - 你只能添加或刪除它們。這就是封裝的水平。

您應該區分事件以及任何可能碰巧是事件後備存儲的變量。活動只支持訂閱和刪除。請參閱我的article on events and delegates瞭解更多信息。

請注意,您現有的代碼可以是一個小整潔不已:雖然你不是使用n這裏

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

...,它不是真正清楚你爲什麼循環。

+0

'SystemEvents'是框架的一部分(在'Microsoft.Win32')。 – 2010-10-26 13:12:32

+0

@Fredrik:謝謝,編輯。 – 2010-10-26 13:22:39

0

將代表事件與代表分開的一個特徵是+ =和 - =僅限於局外人。如果您不擁有該活動,則無法對除此之外的活動執行任何其他操作。

擁有該事件的類可以ofcourse做到:

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