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

C# 哪种结构更好,将事件处理程序作为arg传递,还是侦听事件触发?,c#,events,event-handling,C#,Events,Event Handling,我想知道有关事件处理程序使用的适当类结构 我有年龄类,当年龄值更改时,它会导致操作。我有一个Person类,它的成员变量是Age对象 在我的第一个场景中,Person类将其事件处理程序作为其构造函数的参数传递给Age对象 class Age { private readonly EventHandler _valueChanged; private int _value; public int Value { get { return _val

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

我有年龄类,当年龄值更改时,它会导致操作。我有一个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.
    }
}

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

首先让我们在这里指出几点:

  • 事件
    是一个多播委托,它允许广播消息以发出动作发生的信号
  • delegate
    是一种表示方法引用的类型,我们可以使用该方法调用它们
因此,这里显示的两种方法在某些场景中是“正确的”,而在其他场景中是“不正确的”。如果我们只想执行一个回调方法,那么传递一个委托就足够了

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

附言。
以下是Jon Skeet的精彩演讲,他详细解释了活动和代表之间的区别

非常感谢您的友好回答。我完全忘记了事件是多播委托。我决定选择第二种方法,因为当
Age
值发生变化时,可以更轻松地调用多个操作。@user4134476顺便说一句,我添加了一个链接,指向Jon Skeet撰写的一篇精彩文章,您可能想再次感谢您的好意。这篇文章帮助我理解了事件和代理之间的区别。