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设置器中执行这两个操作(以及非平凡的其他任何地方)例子)?
答案 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()); }
}
}