从另一个事件中引发事件是否有异味?

时间:2013-08-15 01:46:44

标签: c# events

public class Basket
{
    private int _unitCount;

    public int UnitCount
    {
        get { return _unitCount; }
        set
        {
            _unitCount = Math.Max(0, value);
            OnUnitCountChanged(new EventArgs());
        }
    }

    public event EventHandler UnitCountChanged;
    public event EventHandler Depleted;

    protected virtual void OnUnitCountChanged(EventArgs args)
    {
        var handler = UnitCountChanged;
        if(handler!=null) { handler(this, args); }
        if(_unitCount == 0) { OnDepleted(new EventArgs()); }
    }

    protected virtual void OnDepleted(EventArgs args)
    {
        var handler = UnitCountChanged;
        if(handler!=null) { handler(this, args); }
    }
}

在UnitCountChanged 事件中是否有必要检查Depleted和提升该事件的条件是否有问题,或者我是否应该在UnitCount设置器中执行这两个操作(以及非平凡的其他任何地方)例子)?

2 个答案:

答案 0 :(得分:9)

虽然我已经看过它,但我建议不要使用它,并在它出现的方法中引发事件,比如你的UnitCount setter。由于您具有virtual访问修饰符关键字,因此有人可以覆盖该方法,如果它们不调用基础对象,则它将无法按预期工作。

我不喜欢使用我的代码变得更复杂。

答案 1 :(得分:6)

有时候它可能有用(例如,如果你扩展基类并且没有能力覆盖引发事件的方法),但总的来说,我建议不要它。

在这种情况下,我说在UnitCount setter中提升这两个事件会更好:

public int UnitCount
{
    get { return _unitCount; }
    set
    {
        _unitCount = value;
        OnUnitCountChanged(new EventArgs());
        if(_unitCount == 0) { OnDepleted(new EventArgs()); }
    }
}