哪种结构更好,将事件处理程序作为arg传递或侦听事件触发?

时间:2019-01-30 14:02:11

标签: c# events event-handling

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

我有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.
    }
}

哪个结构更好?为什么呢?

1 个答案:

答案 0 :(得分:3)

首先让我们在这里指出一些事情:

  • event多播委托,它可以广播消息以表示操作的发生
  • delegate是一种类型,它表示对方法的引用,我们可以使用这些方法来调用它们

因此,此处显示的两种方法在某些情况下是“正确”的,在其他情况下是“不正确的”。如果我们只想执行一个回调方法,那么传递一个委托就足够了。

但是,如果我们要实现生产者->消费者模式或任何其他基于事件的模式,那么我们将需要一个event

P.S。 这是乔恩·斯凯特(Jon Skeet)令人惊叹的article,他在其中详细解释了事件和代表之间的区别

相关问题