gpt4 book ai didi

c# - EventHandler += 方法是如何实现的?

转载 作者:太空宇宙 更新时间:2023-11-03 20:57:58 25 4
gpt4 key购买 nike

我是 C# 的新手。让我们拥有

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

以后我们用它

cClassObject.Changed += new EventHandler(SomeOtherDelegate);

我的概念很清楚。

  • 在像 Scala 这样的语言中委托(delegate)是 F​​unctionN 类型,lambda。
  • 事件就像 C# 中的对象级发布-订阅 Observable 工具。

问题:

运算符 += 在哪里以及如何实现?我找不到它的代码,它是否是该类专用的特殊编译器?

谢谢

编辑: Here是 Jon Skeet 的一些链接,用于深入的 C# 设计(包括 Eric 建议的自己的博客)。

最佳答案

is it a special compiler thingy that is exclusive for that class?

这是一个特殊的编译器。虽然它没有绑定(bind)到 EventHandler,但通常是事件。您可以使用任何类型的委托(delegate)来声明事件。

在幕后,它只是调用 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);
}
}

关于c# - EventHandler += 方法是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48476755/

25 4 0