从另一个事件中引发一个事件是否很臭
本文关键字:事件 一个 是否 另一个 | 更新日期: 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()); }
}
}