我想知道有关事件处理程序使用的适当类结构。
我有年龄类,当年龄值更改时会导致操作。我有一个 Person 类,它有一个 Age 对象作为其成员变量。
在我的第一个方案中,Person 类将其事件处理程序作为其构造函数的参数传递给 Age 对象。
class Age
{
private readonly EventHandler _valueChanged;
private int _value;
public int Value
{
get { return _value; }
private set
{
_value = value;
RaiseValueChangedEvent();
}
}
public Age(EventHandler handler)
{
_valueChanged = handler;
}
protected void RaiseValueChangedEvent()
{
var handler = _valueChanged;
if (handler != null)
{
handler(this, EventArgs.Empty);
}
}
}
class Person
{
private readonly Age _age;
public Person()
{
_age = new Age(OnAgeChanged);
}
protected void OnAgeChanged(object sender, EventArgs e)
{
// Do what is necessary.
}
}
在我的第二个方案中,Age 类有一个事件,Person 类侦听其事件触发。
class Age
{
public event EventHandler ValueChanged;
private int _value;
public int Value
{
get { return _value; }
private set
{
_value = value;
RaiseValueChangedEvent();
}
}
protected void RaiseValueChangedEvent()
{
var handler = ValueChanged;
if (handler != null)
{
handler(this, EventArgs.Empty);
}
}
}
class Person
{
private readonly Age _age = new Age();
public Person()
{
_age.ValueChanged += OnAgeChanged;
}
protected void OnAgeChanged(object sender, EventArgs e)
{
// Do what is necessary.
}
}
哪个结构更好?为什么呢?
首先,让我们在这里指出几件事:
event
是一个多播委托,它允许广播消息以发出发生操作的信号delegate
是一种类型,表示对方法的引用,我们可以使用这些方法调用它们
因此,此处显示的两种方法在某些情况下都是"正确的",而在其他情况下是"不正确的"。如果我们只想执行一个回调方法,那么传递一个委托就足够了。
但是,如果我们想实现生产者>消费者模式或任何其他基于事件的模式,那么我们需要在那里event
。
附言这是Jon Skeet的一篇精彩文章,他详细解释了事件和代表之间的区别