事件(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)