我是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);
  }
}

09-28 11:20