Work = New ExampleWork()
这里Work
是withevents
变量,我使用handle子句来处理ExampleWork
对象触发的各种事件。但是,在ExampleWork
的构造函数返回之前,不会分配事件处理程序。现在我如何处理从构造函数触发的任何事件?我可以将构造函数逻辑移出到一个单独的方法,并在构造函数返回后调用它,从而处理所有触发的事件,包括从构造函数触发的事件。但它看起来并不好。
处理这种情况的最佳方法是什么?
答案 0 :(得分:3)
忽略用于事件处理的VB语法糖,如果一个对象在构造过程中自行引发事件,那就是设计气味。这些事件只有两种方式可以订阅:
当物体仍在建造时,物体可能会暴露在外面。通过回调或静态方法调用。这通常是一个坏主意 - 如果一个对象仍在构建中,它通常不能被认为是“随时可用”。特别是,仍然可能存在更多派生的构造函数体。
对象可以处理事件本身。这并不是那么糟糕,但是那些事件处理程序仍然需要知道它们将被部分构造的对象调用。
基本上,尽量避免在构造期间在对象上引发事件。理想情况下,使构造函数本身变得简单,使对象处于有效的初始状态。
答案 1 :(得分:0)
处理此问题的一种方法是使用表单或类布尔变量,例如“loading”,例如,将其初始化为false dim loading as boolean = true
。然后在加载或初始化完成后将其设置为true。检查有问题的事件处理程序中的标志。
我同意这种行为是一种设计气味,但设计可能是微软的,因为它有时会出现在trackbar或numericupdown控件中。不过,我肯定会在实施这样一个凌乱的旗帜之前检查Tony的建议。