【问题标题】:Pass function as a parameter in vb.net?在vb.net中将函数作为参数传递?
【发布时间】:2013-10-30 04:19:38
【问题描述】:

我有一个类可以对 Excel 文件执行许多类似但不同的读/写操作。 所有这些操作都在单独的函数中定义。它们都必须包含在同一个长代码块中(检查和打开文件、保存、关闭等的代码)。什么是不必每次都复制此代码的合理方法? 问题是,在执行每个方法不同的代码之前,我不能只包含一个方法包含所有共享代码,因为该代码必须包含在共享代码的 if、try 和 for 语句的许多层中。

是否可以将函数作为参数传递,然后在共享代码中运行该函数?或者有没有更好的方法来处理这个问题?

【问题讨论】:

标签: vb.net function functional-programming parameter-passing


【解决方案1】:

关注实际问题:

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

是的。使用AddressOf <em>TheMethod</em> 将方法传递给另一个方法。参数类型必须是其签名与目标方法的签名匹配的委托。在方法内部,您将参数视为实际方法。示例:

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) 或自定义委托类型。

但是,在许多情况下,使用接口而不是委托实际上是合适的,让不同的类实现您的接口,并将这些不同类的对象传递到您的方法中。

【讨论】:

    【解决方案2】:

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

    您应该使用哪一个取决于您的方法签名。如果你给我们一个,我可以给你更准确的答案。

    【讨论】:

    • 如果我声明为 Func,我会收到错误“未定义类型 func”。如果我声明为 Action,我会收到错误“system.action(of T) 的类型参数很少”。我会传递的一些方法是函数,其中一些是 subs。
    • 它们必须具有相同的签名才能使用Func(Of T)Action(Of T)
    • 被调用子例程的签名是什么样的? Action(of T) 是通过 ByRef 还是 ByVal?我收到错误“如果显式键入所有参数,则必须显式键入所有参数”。我是否正确理解一个动作,如果传递,必须是唯一传递的参数?
    • @Tim Action 等价于SubFunc 等价于Function。至于参数,它取决于您在方法定义中如何定义它们。我建议将它们设为 ByVal,这样会减少混乱,因为您没有显式调用该方法,并且无法保证执行时值的条件,因为这是使用反射框架执行的。
    【解决方案3】:

    您也可以使用delegate,这样您就可以传递具有特定签名的函数/子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-13
      • 2023-04-02
      • 2011-02-13
      相关资源
      最近更新 更多