8
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 设置器(以及非平凡示例中的其他任何地方)中同时执行这两个操作?

4

2 回答 2

9

虽然我已经看到它,但我会建议反对它,并以它会发生的方法引发事件,比如你的UnitCountsetter。由于您具有virtual访问修饰符关键字,因此有人可以覆盖该方法,如果他们不调用基础对象,它将无法按预期工作。

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

于 2013-08-15T01:50:35.383 回答
6

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

在这种情况下,我会说最好在UnitCountsetter 中引发这两个事件:

public int UnitCount
{
    get { return _unitCount; }
    set
    {
        _unitCount = value;
        OnUnitCountChanged(new EventArgs());
        if(_unitCount == 0) { OnDepleted(new EventArgs()); }
    }
}
于 2013-08-15T01:50:41.303 回答