我想知道有关事件处理程序用法的适当类结构。
我有Age类,当更改年龄值时会引起动作。我有一个Person类,该类具有Age对象作为其成员变量。
在我的第一种情况下,Person类将其事件处理程序作为其构造函数的arg传递给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.
}
}
哪个结构更好?为什么呢?
答案 0 :(得分:3)
首先让我们在这里指出一些事情:
event
是多播委托,它可以广播消息以表示操作的发生delegate
是一种类型,它表示对方法的引用,我们可以使用这些方法来调用它们因此,此处显示的两种方法在某些情况下是“正确”的,在其他情况下是“不正确的”。如果我们只想执行一个回调方法,那么传递一个委托就足够了。
但是,如果我们要实现生产者->消费者模式或任何其他基于事件的模式,那么我们将需要一个event
。
P.S。 这是乔恩·斯凯特(Jon Skeet)令人惊叹的article,他在其中详细解释了事件和代表之间的区别