gpt4 book ai didi

c# - 为什么事件不提供 3 种访问器方法?

转载 作者:太空狗 更新时间:2023-10-30 01:07:37 24 4
gpt4 key购买 nike

在实现事件时,可以提供用于添加删除 事件处理程序的代码。但是,可以通过三种方式访问​​事件:

MyEvent += Handler;                // add accessor
MyEvent -= Handler; // remove accessor
MyEvent(this, EventArgs.Empty); // not supported by an accessor

让另一个名为 invoke 的访问器负责该操作不是很明显吗?我的想法是:

class BaseClass
{
public virtual event EventHandler MyEvent { add; remove; protected invoke; }
}

class DerivedClass : BaseClass
{
public override event EventHandler MyEvent
{
invoke
{
// new code before event
base.MyEvent(this, ...);
// new code after event
}
}
}

我知道 old-style pattern ,也就是实现一个OnMyEvent(...)方法。但是这种方法有两个重要的缺点:

  1. 事件代码是分散的 -> 组织较少的代码库
  2. 您无法轻易重构事件(例如,重命名)

编辑:显然,编译器团队已经针对此功能进行了设计(参见 GetRaiseMethod())。

最佳答案

这是有目的的,这样您就不会调用您不“拥有”的事件。

编辑(针对您的编辑):即使在继承的类中,您是否应该始终能够调用它也不清楚。通常是的,因此通用模式已明确规定:

  • 定义一个事件(On为前缀)
  • 创建一个具有相同名称但前缀为 On 的 protected 虚方法,它接受适当的 EventArgs 并且只执行 null 检查和调用。
  • 始终通过虚方法引发事件

这种模式允许更大的灵 active ;可以通过继承方法来更改或省略事件或进行事件后处理。如果不存在任何方法,则事件调用是私有(private)的。

关于c# - 为什么事件不提供 3 种访问器方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11737175/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com