我正在使用C#3.0。遵循这一标准的事件模式,我有:我的班级是否应该订阅自己的公共活动?
public event EventHandler<EventArgs> SomeEventHappens;
protected virtual void OnSomeEventHappens(EventArgs e)
{
if (SomeEventHappens != null)
{
SomeEventHappens(this, e);
}
}
private object _someProperty;
public object SomeProperty
{
get
{
return _someProperty;
}
private set
{
if (_someProperty == value)
{
return;
}
OnSomeEventHappens(EventArgs.Empty);
_someProperty = value;
}
}
在我的同班我想的时候采取一些行动SomeProperty
变化。我看到它的方式,我有3个替代品:
1)做我的SomeProperty
二传手。有些事情是因为我试图订阅每件事物的哲学应该做一件事而做得很好,所以我错了。把东西塞进一个二传手似乎是违背了这一点,或者至少有倾向于。
2)在OnSomeEventHappens
做东西。再次,似乎有点反对保持这个简单的作品。此外,如果此方法被覆盖,如果实现者不调用基方法,可能会失去功能。
3)是否订购了SomeEventHappens
。对我来说,就封装而言,这似乎是一个合适的选择,而且看起来很干净。再次,如果OnSomeEventHappens
被覆盖,可能会产生影响。
也许有更优雅的东西?我无法在方案2和方案3之间做出决定,而且我很好奇最佳实践是什么。毕竟,最安全的地方也许就是财产创造者。
想法?
更新: 感谢您的好评和下面的答案。我已经了解到,让班级订阅自己的活动是“可以的”,尽管在我的情况下,我倾向于因为开销而不愿意这样做。我已经考虑到了我的虚拟方法的潜在覆盖者的行为,以及我想要发生的事情。
在我的现实世界中,我并不想在未设置属性的情况下引发事件。由于下面的答案指导了我的思考过程,所以我认为我可以选择1,因为开销较低,从继承者那里行为不当的风险降低,并且通常对我来说更合适。再次感谢!
我选择了这个答案,因为它是我最终做的最接近的解释。我从其他答案中学到了很多东西。谢谢! – 2010-08-18 12:01:29