Dav*_*vid 11 c# events delegates copying
我只是在MSDN 上阅读有关事件的页面,我遇到了一段令我困惑的示例代码.
有问题的代码是这样的:
// Make a temporary copy of the event to avoid possibility of
// a race condition if the last subscriber unsubscribes
// immediately after the null check and before the event is raised.
EventHandler<CustomEventArgs> handler = RaiseCustomEvent;
Run Code Online (Sandbox Code Playgroud)
我理解代码的意图,但我没有看到该特定行如何制作任何东西的副本.它所做的只是复制参考 ; 它实际上并没有制作委托实例的深层副本.所以为此,它实际上并没有完全阻止竞争条件.
我错过了一些明显的东西吗?
小智 18
代理是不可变的,因此保证代码中获得的引用不会改变.如果用户在空检查后订阅或取消订阅,则将创建新的委托并将其设置为该事件.但是,由于您具有对完全不同的对象的引用并调用它,因此您不必担心它为null.
你是对的; 它正在复制参考.
但是,代表是不变的; 当您向事件添加处理程序时,会创建一个新委托,将当前处理程序与新处理程序组合,然后分配给该字段.
字段引用的Delegate实例不能更改,因此它确实避免了竞争条件.
| 归档时间: |
|
| 查看次数: |
3360 次 |
| 最近记录: |