在VB.NET中将函数作为参数传递?

20

我有一个类,它执行多个相似但不同的读写操作到一个Excel文件。所有这些操作都在不同的函数中定义。它们都必须包含在相同的长代码块中(检查和打开文件、保存、关闭等代码)。有没有合理的方法来避免每次重复这段代码呢? 问题是我不能只使用一个包含所有共享代码的方法,然后执行每个方法所特有的不同代码,因为该代码必须包含在共享代码的许多if、try和for语句的层级结构中。

是否可能将一个函数作为参数传递,然后在共享代码中运行该函数?或者有更好的处理方法吗?


可能是如何在VBNET中将MethodName作为过程的参数传递的重复内容。 - mbomb007
3个回答

39

聚焦实际问题:

是否可以将函数作为参数传递?

是的。使用 AddressOf TheMethod 将该方法传递到另一个方法中。参数类型必须是与目标方法匹配的委托。在方法内部,您将该参数视为实际方法。例如:

Sub Foo()
    Console.WriteLine("Foo!")
End Sub

Sub Bar()
    Console.WriteLine("Bar!")
End Sub

Sub CallSomething(f As Action)
    f()
End Sub

' … somewhere:
CallSomething(AddressOf Foo)
CallSomething(AddressOf Bar)

正如我所说的,实际参数类型取决于您想要传递的方法签名。使用Action(Of T)Func(Of T)或自定义委托类型。
然而,在许多情况下,使用接口而不是委托更为合适,将不同的类实现您的接口,并将这些不同类的对象传递到您的方法中。

9

将参数声明为 Func(Of T)Action(Of T)

使用哪个取决于您的方法签名。如果您告诉我们一个,我可以给您更精确的答案。


如果我声明为Func,会出现“类型func未定义”的错误。如果我声明为Action,则出现“对于system.action(of T)的参数太少”的错误。我传递的一些方法是函数,其中一些是子程序。 - Bernoulli Lizard
它们必须具有相同的签名才能使用Func(Of T)Action(Of T) - MarcinJuraszek
被调用的子程序签名是什么样子?Action(of T)是通过ByRef还是ByVal传递的?我收到了“如果其中任何一个参数已明确指定类型,则所有参数都必须明确指定类型”的错误。我的理解是,如果传递了Action,则它必须是唯一传递的参数,这正确吗? - Tim
@Tim Action 相当于 Sub,而 Func 则相当于 Function。至于参数,则取决于您在方法定义中如何定义它们。我建议将它们定义为 ByVal,这样会减少混淆,因为您没有显式调用该方法,并且无法保证执行时值的条件,因为这是使用反射框架来执行的。 - GoldBishop

4

您还可以使用委托,以便传递具有特定签名的函数/子例程。


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