我正在使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
在同一个班级里,我想在SomeProperty
改变时采取一些行动.我看到它的方式我有3种选择:
1)在我的SomeProperty
二传手中做东西.因为我试图订阅所有事情的理念应该做一件事并做得好,因此有些事情让我误解了这一点.塞进东西的东西似乎与此相反,或者至少有这种倾向.
2)做的东西OnSomeEventHappens
.再次,似乎有点反对保持这个简单的部分.此外,如果此方法被覆盖,如果实现者不调用基本方法,则可能会丢失功能.
3)让班级订阅SomeEventHappens
.对我而言,就封装而言,这似乎是正确的选择,而且看起来很干净.再次,如果OnSomeEventHappens
被覆盖可能会产生影响.
也许有更优雅的东西?我不能在选项2和3之间做出决定,我很好奇最佳实践是什么.也许最安全的地方就是物业安置者.
思考?
更新: 感谢下面的精彩评论和答案.我已经知道让一个类订阅自己的事件是"没问题的",尽管在我的情况下我倾向于不做因为开销.我已经考虑了我的虚拟方法的潜在重写器的行为以及我想要发生什么.
在我的真实案例中,我真的不希望在没有设置属性的情况下引发事件.由于下面的答案指导了我的思考过程,我认为我可以选择1,因为开销较低,继承人不正当行为的风险降低,而且通常对我来说更有意义.再次感谢!
如果您从某个公共位置(属性过程或另一个函数)调用 SomeEventHappens 和 OnSomeEventHappens,那么您不必担心覆盖程序会忽略引发事件。我更愿意重写函数而不是处理事件,因为开销更少。