代码之家  ›  专栏  ›  技术社区  ›  user4134476

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

  •  2
  • user4134476  · 技术社区  · 7 年前

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

    1 回复  |  直到 7 年前
        1
  •  3
  •   Fabjan    7 年前

    首先,让我们指出以下几点:

    • event 是一个 多播委托 允许广播消息以发出动作发生的信号
    • A. delegate 是一种表示方法引用的类型,我们可以使用该方法调用它们

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

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

    附笔。 这是一个令人惊奇的故事 article Jon Skeet在书中详细解释了事件和代表之间的区别