更新时间:2022-06-09 01:44:57
I've written this up in a fair amount of detail in an article, but here's the summary, assuming you're reasonably happy with delegates themselves:
对于类似字段的事件,有一些同步,否则添加/删除只需调用 Delegate.合并/删除以更改自动生成字段的值.这两个操作都分配给支持字段 - 请记住,委托是不可变的.换句话说,自动生成的代码很像这样:
For field-like events, there's some synchronization but otherwise the add/remove just call Delegate.Combine/Remove to change the value of the auto-generated field. Both of these operations assign to the backing field - remember that delegates are immutable. In other words, the autogenerated code is very much like this:
// Backing field
// The underscores just make it simpler to see what's going on here.
// In the rest of your source code for this class, if you refer to
// ElementAddedEvent, you're really referring to this field.
private EventHandler<EventArgs> __ElementAddedEvent;
// Actual event
public EventHandler<EventArgs> ElementAddedEvent
{
add
{
lock(this)
{
// Equivalent to __ElementAddedEvent += value;
__ElementAddedEvent = Delegate.Combine(__ElementAddedEvent, value);
}
}
remove
{
lock(this)
{
// Equivalent to __ElementAddedEvent -= value;
__ElementAddedEvent = Delegate.Remove(__ElementAddedEvent, value);
}
}
}
在您的情况下,生成字段的初始值为 null
- 如果删除所有订阅者,它将始终再次变为 null
,因为那是Delegate.Remove 的行为.
The initial value of the generated field in your case is null
- and it will always become null
again if all subscribers are removed, as that is the behaviour of Delegate.Remove.
如果你想要一个no-op"处理程序来订阅你的事件,以避免无效性检查,你可以这样做:
If you want a "no-op" handler to subscribe to your event, so as to avoid the nullity check, you can do:
public EventHandler<EventArgs> ElementAddedEvent = delegate {};
delegate {}
只是一个匿名方法,它不关心它的参数并且什么都不做.
The delegate {}
is just an anonymous method which doesn't care about its parameters and does nothing.
如果还有什么不清楚的地方,请询问,我会尽力帮助的!
If there's anything that's still unclear, please ask and I'll try to help!