哪个是更好的结构,将事件处理程序作为 arg 传递,或者侦听事件触发



我想知道有关事件处理程序使用的适当类结构。

我有年龄类,当年龄值更改时会导致操作。我有一个 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的一篇精彩文章,他详细解释了事件和代表之间的区别

相关内容

  • 没有找到相关文章

最新更新