zhouqijie

事件(Event)

事件基于委托,为委托提供了一种发布/订阅机制。

CRE:事件是受限的委托。

什么是事件

事件就是将上述广播者和订阅者模式正式化的一个语言特性。它只暴露了所需的委托特性的部分子集。
事件的主要目的就是防止订阅者之间互相干扰。event修饰的委托成员,在类中可以像委托一样访问,但在类外只能进行+=/-=操作。

?:编译器会把事件转换为一个私有委托,以及实现+=/-=操作的public访问器。
CRE:Unity就是外部访问器AddListener和RemoveListener实现的自定义事件。

完整语法的事件定义

在事件定义的简化记法中,编译器会创建一个EventHandler委托类型的变量,并添加方法,以便从委托中订阅和取消订阅。该简化记法的较长形式如下所示,这非常类似自动属性和完整属性之间的关系。

public EventHandler<EventArgs> foo;
public event EventHandler<EventArgs> Foo
{
    add
    {
        foo += value;
    }
    remove
    {
        foo -= value;
    }
}

广播者和订阅者

使用委托时一般会出现广播者订阅者两个角色。
广播者包含一个委托变量。它通过调用委托来决定什么时候广播。
订阅者是方法目标的接收者。订阅者通过在委托上+=/-=来决定何时开启/结束监听。

CRE:这是标准的观察者模式

弱事件

通过事件可以直接连接发布程序和侦听器。但是垃圾回收方面存在问题。例如,如果不再直接引用侦听器,发布程序就仍有一个引用,垃圾回收器就不能清空侦听器所占内存。

这种强链接可以通过弱事件模式来解决,即使用WeakEventManager作为发布程序和侦听器的中介。

var dealer = new Dealer();
var daniel = new Consumer("Daniel");
WeakEventManager<Dealer, EventArgs>.AddHandler(dealer, "SomeEvent", daniel.OnSomeEvent);

(END)