Checking if an event handler exists
Following on from this post - what are the disadvantages when using the -=
then +=
approach suggested when I only ever want one handler event to fire?开发者_运维技巧
_value.PropertyChanged -= _handlerMethod;
_value.PropertyChanged += _handlerMethod;
This doesn't guarantee that there is only one handler fired.
Another location could, potentially, subscribe your handler to your event multiple times. In this case, you will only remove the first handler call.
By inspecting the invocation list of the event, you could guarantee this behavior, if you truly only want a single handler to be subscribed at a time.
If you really want only one handler to execute, then you may want to use a settable property of the appropriate delegate type instead of an event. Only one delegate will be stored; you can execute the delegate the same as you would the event handler.
The idea here is that the -= operator is not going to do anything if your event handler is not assigned.
I don't personally like this approach, I think you should really aim to refactor your code so that you know that the event handler is assigned only once.
The disadvantages would be: - possibility of race condition, if your app is multithreaded and the event gets fired when the handler is not assigned - I am also not sure what happens when you run _value.PropertyChanged -= _handlerMethod when two copies of the handler are already assigned. - messy code - obviously its not clear from the code which class and when is listening to the event
精彩评论