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

5

我正在编写一个函数,它接受一个在外部定义的子过程,并根据所包含类中的变量运行它一定次数。如何在VB.NET中将Sub devs作为参数传递?或者有没有替代方法?(更新:这是一个用于WPF应用程序的计时器类,我将在制作的乒乓球游戏中使用。新方法应该将一个子过程作为参数,然后告诉另一个名为Run()的子过程每个x毫秒执行该子过程)


1
循环通常用于多次处理某些东西,但在这里您并没有给我们足够的信息。 - Charles May
1
你是否正在寻找Action Delegate?还有一种Func委托,适用于方法返回值的情况如此处所示 - Ňɏssa Pøngjǣrdenlarp
我知道我需要在这里使用循环,但我需要传入一个用户定义的子过程。因此,对此函数的调用将是loopCommandBasedOnUnAccessibleData(printHelloWorld()),它将打印“Hello World”多次。 - Null Spark
很多时候,人们问错了问题。你为什么不告诉我们(完全)你想要做什么,这样我们就可以给你正确的答案。现在这样的话,就像是赌博一样。 - Steve
1个回答

5
您可以将您的方法 (Sub) 声明为接受一个 Action Delegate 参数。这样,您就可以将无返回值方法 (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

这个调用只需要:

DoSomething(AddressOf HelloWorld)

根据MSDN的说明,Action封装了一个没有参数且不返回值的方法。如果要包含参数,请使用Action(of T)(请参见下文);如果要返回值(使用函数),请使用Func请参阅此示例
当涉及到参数时,请使用Action(Of T)。您还可以将变量声明为Action Delegates,这可以使代码更易于阅读:
Private HelloAction As Action(Of Int32)

然后在像表单加载这样的地方:

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

在这种情况下,HelloWorld 将是:
Private Sub HelloWorld(x As Integer)

非常感谢您 :) 这对我来说真的是一个巨大的帮助。 - Null Spark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接