从另一个事件中引发一个事件是否很臭

本文关键字:事件 一个 是否 另一个 | 更新日期: 2023-09-27 18:27:48

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 事件中引发该事件是否存在问题,或者我应该在 UnitCount setter(以及非平凡示例中的其他任何地方(中同时执行这两个操作?

从另一个事件中引发一个事件是否很臭

虽然我已经看到了它,但我建议不要使用它,并以它会发生的方法提出事件,比如你的UnitCount二传手。 由于您有 virtual 访问修饰符关键字,因此有人可以重写该方法,如果他们不调用基对象,它将无法按预期工作。

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

有时它可能很有用(例如,如果您正在扩展基类并且无法重写引发事件的方法(,但总的来说,我建议不要这样做。

在这种情况下,我会说最好在UnitCount二传器中提出两个事件:

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