【发布时间】: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)))。这样,它就始终可用,并在您下次处理它们时添加到每个项目中。