事件处理程序访问器/属性的用途究竟是什么?

时间:2014-05-14 11:50:34

标签: c# interface eventargs eventhandler

我有一个界面:

event EventHandler<MagazineEventArgs> MagazineChangedEvent;

当我实现界面时,Visual Studio为我生成以下模板:

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

但是,我不明白我应该如何使用这些属性。

1 个答案:

答案 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 1part 2part 3afterword

如果您正在做一些相当不同的事情,通常只需要自己实现该事件 - 例如,将事件订阅链接到不同的基础事件,或者使用EventHandlerList作为有效存储各种事件的稀疏订阅的方法。

了解事件和普通代理字段的区别是很重要的 - 它类似于属性和字段之间的区别,虽然稍微有些细微差别,因为事件只有“订阅和取消订阅”操作,而调用者无法提升他们或确定其他订阅者。有关详细信息,请参阅my article on the topic