从未绑定过的事件中解除委托有问题吗?

4

我正在使用C#下的标准Windows窗体控件。

我有两个控件,它们是设置单个值的不同方式。因此,当一个控件改变时,更改事件处理程序会计算另一个控件的值并设置它。因此,我需要暂时取消第二个控件上的更改事件以防止循环(A更改B,B被更改,因此它更改A,A被更改...)。还有其他一些情况,我需要停止更改事件。因此,有几个地方需要取消事件,并且只有一个地方需要连接它。

我的问题是:我需要跟踪事件是否已经连接,还是可以随意取消多次,并且只偶尔重新连接?(是否有任何文档解决这个问题?)

3个回答

5
使用“-=”运算符取消注册从未注册的事件处理程序不会引起任何问题。

1

是的,您可以随时取消挂钩,不会抛出任何异常。


1

这将循环遍历并取消挂钩任何已订阅的方法:

Delegate[] subscribers = myEvent.GetInvocationList();

    for(int i = 0; i < subscribers.Length; i++)

    {

    myEvent -= subscribers[i] as yourDelegateType;

    }

然而,我认为你应该能够通过编写一个处理程序来避免循环问题,并在其中加入逻辑以确定数据应该如何修改。这样做会更简洁和易于维护。

我正打算发布一些类似的内容,关于更易维护的解决方案。特别是,我不想成为后来维护分配和删除处理程序代码的开发人员,而这些代码没有使用标志或单个处理程序。 - JMD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接