如何将子过程作为参数传递 VB.NET

Nul*_*ark 5 vb.net parameters

我正在编写一个函数,它采用外部定义的子过程并根据所包含的类中的变量运行它一定次数。如何在 VB.NET 中将子开发人员作为参数传递?或者有什么替代方法可以做到这一点?(更新:这是用于 WPF 应用程序的计时器类,我将在我正在制作的 Pong 游戏中使用该计时器类。新方法应该采用子过程作为参数,然后它告诉另一个调用的子过程来Run()执行该子过程每 x 毫秒)

Ňɏs*_*arp 5

您可以将您的方法 ( Sub) 声明为带有Action Delegate参数。这允许您将 void 方法 ( ) 的地址HelloWorld作为参数传递:

Private Sub DoSomething(a As Action)
    ' pick a random number 1-5
    Dim v = RNG.Next(1, 6)
    ' call whatever v times
    For n As Int32 = 0 To v
        a()
    Next
End Sub

Private Sub HelloWorld()
    Console.WriteLine("Null Spark says 'Hello, World!'")
End Sub
Run Code Online (Sandbox Code Playgroud)

调用它只是:

DoSomething(AddressOf HelloWorld)
Run Code Online (Sandbox Code Playgroud)

正如 MSDN 所指出的,Action封装了一个没有参数且不返回值的方法。包含参数使用Action(of T)(见下文);要返回值(使用函数),请使用Func请参阅此示例


当涉及参数时使用Action(Of T). 您还可以声明变量,这样Action Delegates可以使代码更易于阅读:

Private HelloAction As Action(Of Int32)
Run Code Online (Sandbox Code Playgroud)

然后在某个地方加载表单:

HelloAction = AddressOf HelloWorld
...
Private Sub DoSomething(a As Action(Of Int32))
    Dim v = RNG.Next(1, 6)
    For n As Int32 = 0 To v
        a(n)            ' pass the int param
    Next
End Sub
Run Code Online (Sandbox Code Playgroud)

在这种情况下,HelloWorld将是:

Private Sub HelloWorld(x As Integer)
Run Code Online (Sandbox Code Playgroud)