【问题标题】:Using Events with Shared subs?将事件与共享订阅一起使用?
【发布时间】:2017-04-25 04:00:43
【问题描述】:

我有一个方法应该实现为Shared,因为它没有内部状态:

Friend Class MMDates
    Friend Shared Sub Calculate(ByRef CP As DataPlug)
        MsgBox("dates was called with " & CP.Name)
    End Sub
End Class

现在我想允许通过RaiseEvent 调用该方法,所以我这样做了:

Friend Class MMDates
    Friend Shared WithEvents DP As DataPlug
    Friend Shared Sub Calculate(ByRef CP As DataPlug) Handles DP.CalculateDates
        MsgBox("dates was called with " & CP.Name)
    End Sub
End Class

在调用者DataPlug中,我添加了:

Public Event CalculateDates(ByRef CP As DataPlug)
Friend Sub Calculate()
    RaiseEvent CalculateDates(Me)
End Sub

所有这些都编译得很好,并且Raise 被正确调用,但该事件从未在MMDates 中被捕获。我通过将其添加到MMDates 来实现替代方案:

Public Shared Sub StartListening()
    AddHandler DataPlug.CalculateDates, AddressOf Calculate
End Sub

...然后在我的应用程序的启动例程中调用它。这在技术上是我想要的——事件确实最终会调用共享方法。然而,这个链接是在运行时创建的,即使它确实是在编译时定义的。

那么这种Shared 事件模式在VB.net 中是否可能在编译时使用Handles 的变体或其他语法?

【问题讨论】:

  • 您是否曾经将 MMDates.DP 设置为 DataPlug 实例?是引发 CalculateDates 的同一实例吗?
  • Friend Shared WithEvents DP As DataPlug --> ... As NEW DataPlug。否则共享或不共享 - 工作方式相同
  • 既然这显然与your previous question 相关,为什么不定义一个扩展来对集合做任何事情(在最后一个Q 中它是List(Of Dictionary(Of Integer, String)))。这样,它就始终可用,并在您下次处理它们时添加到每个项目中。

标签: vb.net events


【解决方案1】:

好的,所以正确的方法是使用Partial,将其烘焙到较低级别,然后仅填写混音。所以在我的例子中,我在基类中为Calculate 做了一个部分,并在 Calc 中实现了,并且 presto!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 2020-10-21
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    相关资源
    最近更新 更多