2014-05-14 24 views
0

我与线路的接口:事件处理程序访问器/属性的使用究竟是什么?

event EventHandler<MagazineEventArgs> MagazineChangedEvent; 

当我实现这个接口时,Visual Studio生成我下面的模板:

event EventHandler<MagazineEventArgs> IMagazineConfigView.MagazineChangedEvent 
{ 
    add { throw new NotImplementedException(); } 
    remove { throw new NotImplementedException(); } 
} 

不过,我不明白我究竟是如何应利用这些属性。

回答

3

通常情况下,您只需使用字段式事件即可。只是声明:

public event EventHandler<MagazineEventArgs> MagazineChangedEvent; 

这是大致等于宣告私人委托外地和存取方法订阅并取消从中:

private EventHandler<MagazineEventArgs> magazineChanged; 

public event EventHandler<MagazineEventArgs> MagazineChangedEvent 
{ 
    add { magazineChanged += value; } 
    remove { magazineChanged -= value; } 
} 

...但现场般的事件语法提供更多的线程安全。线程安全性的确切性质取决于您使用的C#版本。从C#4开始,它们比它们更清洁 - 请参阅Chris Burrows的博客文章(part 1,part 2,part 3,afterword)。

你通常只需要自己实现事件,如果你正在做的事情,而不同 - 例如,事件订阅链接到不同潜在的事件,或者使用EventHandlerList为有效地存储为稀疏订阅的方式广泛的事件。

了解事件和滑动委托域之间的区别是很重要的 - 这是类似属性和字段之间的区别,虽然略有更细致入微的事件只有“订阅和退订”业务,没有办法提高来电的他们或确定其他用户。有关更多信息,请参见my article on the topic