如何实现EventHandler + =方法?

时间:2018-01-27 14:25:54

标签: c#

我是C#的新手。我们有

class C {
   // ...
   public event EventHandler Changed;
}

稍后我们使用它

cClassObject.Changed += new EventHandler(SomeOtherDelegate);

概念对我来说很清楚。

  • 像Scala这样的lang中的委托将是FunctionN类型,lambda。
  • 事件就像C#中的对象级pub-sub Observable类工具。

问题:

运营商 + = 在何处以及如何实施? 我无法找到它的代码,它是一个特殊的编译器,它是专属于该类的吗?

由于

修改 Here是Jon Skeet关于深入C#设计的一些链接(包括Eric建议的自己的博客)。

1 个答案:

答案 0 :(得分:4)

  

它是一个特殊的编译器,它是专属于该类的吗?

这是一个特殊的编译器。它不仅限于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);
  }
}