我有一个界面:
event EventHandler<MagazineEventArgs> MagazineChangedEvent;
当我实现界面时,Visual Studio为我生成以下模板:
event EventHandler<MagazineEventArgs> IMagazineConfigView.MagazineChangedEvent
{
add { throw new NotImplementedException(); }
remove { throw new NotImplementedException(); }
}
但是,我不明白我应该如何使用这些属性。
答案 0 :(得分: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。