【问题标题】:Handling events fired in constructors处理构造函数中触发的事件
【发布时间】:2009-11-09 23:46:29
【问题描述】:
Work = New ExampleWork()  

这里的Work 是一个withevents 变量,我使用了handles 子句来处理ExampleWork 对象触发的各种事件。然而,在ExampleWork 的构造函数返回之前,不会分配事件处理程序。现在如何处理从构造函数触发的任何事件?我可以将构造函数逻辑移到一个单独的方法中,并在构造函数返回后调用它,从而处理所有触发的事件,包括从构造函数触发的事件。不过看起来不太好。 处理这种情况的最佳方法是什么?

【问题讨论】:

    标签: vb.net events


    【解决方案1】:

    忽略事件处理的 VB 语法糖,如果一个对象在其构造过程中对其自身引发事件,那是一种设计味道。只有两种方式可以订阅这些事件:

    • 对象可能在构建过程中将自身暴露给外部世界,例如通过回调或静态方法调用。这通常是一个坏主意——如果一个对象仍在构建中,它通常不能被认为是“准备好使用”。特别是,可能还有更多派生的构造函数体需要调用。

    • 对象可能正在处理事件本身。这还不算太糟糕,但这些事件处理程序仍然需要注意它们将在部分构造的对象上被调用。

    基本上,尽量避免在构造过程中在对象上引发事件。理想情况下,让构造函数本身变得漂亮而简单,让对象处于有效的初始状态。

    【讨论】:

      【解决方案2】:

      处理此问题的一种方法是使用表单或类布尔变量,例如“正在加载”,将其初始化为 false dim loading as boolean = true。然后在加载或初始化完成后将其设置为true。检查违规事件处理程序中的标志。

      我同意这种行为是一种设计气味,但该设计可能是 Microsoft 的,因为它有时会出现在 trackbar 或 numericupdown 控件中。不过,在实现这样的混乱标志之前,我肯定会检查 Tony 的建议。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-06
        • 2022-11-22
        • 2015-12-13
        • 1970-01-01
        • 2019-02-08
        • 2013-08-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多