【问题标题】:How to notify event subscriber如何通知事件订阅者
【发布时间】:2011-05-27 07:34:25
【问题描述】:

在我上次的工作面试中,有人问我如何实现一个公开事件并在新的事件订阅者订阅该事件时通知他们的类。

换句话说,当数据源更新时,一个类会公开一个事件来通知订阅者;许多其他类可以在任何时间点订阅该事件。当一个类订阅事件时,必须通知它获取存储到数据源中的最新版本数据,但不得通知其他类(它们已经是最新的)。

他们建议我重写 addHandler 方法,但我如何只通知新订阅者?

.net 是否有我不知道的功能,或者我需要在订阅者类中定义一个方法,以便在添加到处理程序时调用(某种观察者模式)?

编辑:我想我不清楚,所以我会尝试用另一种方式解释它。 假设我有一个观察者模式。当一个新的观察者订阅主题时,它会立即更新为主题的最新数据源值。稍后,当数据源中的某些内容发生变化时,主题将像往常一样通知所有注册的观察者。有人问我如何使用 .net 事件来实现这一点

【问题讨论】:

    标签: c# events


    【解决方案1】:

    您的术语很模糊-“必须激活”是什么意思?你的意思是事件处理程序必须在订阅时调用一次?如果是这样,那听起来像:

    private EventHandler foo;
    
    public event EventHandler Foo 
    {
        add
        {
            if (value != null)
            {
                value(this, EventArgs.Empty);
            }
            foo += value;
        }
    
        remove
        {
            foo -= value;
        }
    }
    

    这是一个非常奇怪的设计。

    如果这不是你想要的,请尝试澄清。

    更多信息请查看我的article on events and delegates

    【讨论】:

    • 当订阅者添加到他们立即需要提供最新值的事件时,是否存在这种情况。既然这样,这种模式就没有用了。
    • 据我了解,他们想知道如何只通知最后一个事件订阅者,我建议在任何新订阅时提出事件,他们这样回答我会通知所有订阅者(并原谅我的英语不好,我已将“激活”替换为“通知”)
    • @Stefano:实际上没有。这只会在存储在值中的新委托上引发它。我也会质疑它是否是好的设计。我真的不希望在分配甚至结束之前引发事件。最好让客户在需要时在开始收听事件之前提取新信息。
    猜你喜欢
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 2017-04-22
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多