我是C#的新手。让我们
class C {
// ...
public event EventHandler Changed;
}
以后我们用它
cClassObject.Changed += new EventHandler(SomeOtherDelegate);
概念对我来说很清楚。
像Scala这样的langs中的委托将是FunctionN类型,即lambda。
事件就像C#中的对象级pub-sub Observable一样的工具。
题:
+ =在何处以及如何实现?
我找不到其代码,这是该类专用的特殊编译器吗?
谢谢
编辑:
Here是Jon Skeet进行深入C#设计的一些链接(包括Eric建议的自己的博客)。
最佳答案
它是该类专用的特殊编译器吗?
这是一个特殊的编译器。虽然它不绑定到EventHandler
,但通常是事件。您可以使用任何类型的委托来声明事件。
在后台,它只是调用Delegate.Combine
并进行一些同步处理种族状况:
这段代码:
public event EventHandler Test;
public void Hello()
{
Test += Program_Test
}
将编译为:
private EventHandler Test;
public event EventHandler Test
{
add
{
EventHandler eventHandler = this.Test;
EventHandler comparand;
do
{
comparand = eventHandler;
eventHandler = Interlocked.CompareExchange<EventHandler>(ref this.Test, (EventHandler) Delegate.Combine((Delegate) comparand, (Delegate) value), comparand);
}
while (eventHandler != comparand);
}
remove
{
EventHandler eventHandler = this.Test;
EventHandler comparand;
do
{
comparand = eventHandler;
eventHandler = Interlocked.CompareExchange<EventHandler>(ref this.Test, (EventHandler) Delegate.Remove((Delegate) comparand, (Delegate) value), comparand);
}
while (eventHandler != comparand);
}
}