gpt4 book ai didi

c# - 我的类(class)应该订阅自己的公共(public)事件吗?

转载 作者:可可西里 更新时间:2023-11-01 09:12:12 24 4
gpt4 key购买 nike

我正在使用 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 setter 中做一些事情。做这件事让我感到有些不对劲,因为我试图认同一切都应该做一件事并做好的哲学。将东西塞进二传手似乎违背了这一点,或者至少有这样的倾向。

2) 在 OnSomeEventHappens 中做一些事情。再一次,似乎有点反对将其保持在简单的部分。此外,如果此方法被覆盖,如果实现者不调用基本方法,则可能会失去功能。

3) 让类(class)订阅SomeEventHappens。对我来说,就封装而言,这似乎是正确的选择,而且看起来很干净。同样,如果 OnSomeEventHappens 被覆盖,可能会产生影响。

也许有更优雅的东西?我无法在选项 2 和选项 3 之间做出决定,我很好奇最佳实践是什么。也许最安全的地方毕竟是属性 setter 。

想法?

更新:感谢下面的精彩评论和回答。我了解到让一个类订阅它自己的事件是“可以”的,尽管就我而言,由于开销,我倾向于不这样做。我已经考虑了我的虚拟方法的潜在覆盖者的行为以及我到底想要发生什么。

在我的真实案例中,我真的不希望在未设置属性的情况下引发事件。由于以下答案指导了我的思考过程,我认为我可能会选择选项 1,因为开销较低,继承人不当行为的风险降低,而且它通常对我来说更有意义。再次感谢!

最佳答案

如果您从某个公共(public)位置(属性过程或其他函数)调用 SomeEventHappens 和 OnSomeEventHappens,则您不必担心覆盖程序忽略引发事件。我宁愿覆盖一个函数而不是处理事件,因为开销更少。

关于c# - 我的类(class)应该订阅自己的公共(public)事件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3505851/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com