C#事件订阅和取消订阅副本

C#事件订阅和取消订阅副本,c#,event-handling,C#,Event Handling,如果使用eventHandler订阅同一事件三次,是否有问题? e、 g 这是否会导致ChangeHandler被调用3次而不是1次?处理这个问题的最佳方法是什么 请注意,这些冗余不是在一起的,而是代码路径的不同区域 同样,取消订阅未注册的活动是否存在问题? e、 g 如果您多次订阅一个事件,那么您的处理程序将被调用相应的次数——在您的示例中是三次 这是否是一个问题取决于事件处理程序的功能,但我假设您不希望多次调用它 取消订阅您尚未订阅的活动没有问题 因此,如果您不确定应用程序处于何种状态(尽管

如果使用eventHandler订阅同一事件三次,是否有问题? e、 g

这是否会导致ChangeHandler被调用3次而不是1次?处理这个问题的最佳方法是什么

请注意,这些冗余不是在一起的,而是代码路径的不同区域

同样,取消订阅未注册的活动是否存在问题? e、 g


如果您多次订阅一个事件,那么您的处理程序将被调用相应的次数——在您的示例中是三次

这是否是一个问题取决于事件处理程序的功能,但我假设您不希望多次调用它

取消订阅您尚未订阅的活动没有问题

因此,如果您不确定应用程序处于何种状态(尽管您确实应该处于这种状态),您可以:

a.SomethingChanged -= ChangeHandler;
...
a.SomethingChanged += ChangeHandler;
(注意:
neweventhandler(…)
是语法糖,可以省略)

如果使用eventHandler订阅同一事件三次,是否有问题

不,它只会添加事件处理程序三次

这是否会导致ChangeHandler被调用3次而不是1次

处理这个问题的最佳方法是什么

这取决于你想要什么;你还没有具体说明。如果仅当事件处理程序尚未添加时才想添加事件处理程序,则只需删除事件处理程序,然后再次添加:

a.SomethingChanged -= new EventHandler(ChangeHandler);
a.SomethingChanged += new EventHandler(ChangeHandler);
取消订阅未注册的活动是否存在问题


不,它不会起任何作用。

看看这个问题:,基本上,是的,但你可以避免它。试试看会发生什么!但我很好奇,当相同的结果包含在每个执行路径中时,有排他执行路径背后的想法是什么?因此,如果没有注册,取消订阅(=)基本上没有副作用。对吗?为什么要多次订阅同一活动?您到底想解决什么问题?可能需要多个代码路径。所以我想避免反复检查它是否已经注册。ThxWell,订阅一个事件不止一次可能会有问题,也可能不会有问题。您可能希望多次触发事件处理程序。@Servy-严格来说您是对的,但这不是问题的目的。您好,抱歉,这是一个离题的问题。使用+=neweventhandler(ChangeHandler)和+=ChangeHandler时有区别吗?使用newEventHandler时是否会出现预期的性能或逻辑错误?
a.SomethingChanged -= ChangeHandler;
...
a.SomethingChanged += ChangeHandler;
a.SomethingChanged -= new EventHandler(ChangeHandler);
a.SomethingChanged += new EventHandler(ChangeHandler);