我有一个类,它执行多个相似但不同的读写操作到一个Excel文件。所有这些操作都在不同的函数中定义。它们都必须包含在相同的长代码块中(检查和打开文件、保存、关闭等代码)。有没有合理的方法来避免每次重复这段代码呢? 问题是我不能只使用一个包含所有共享代码的方法,然后执行每个方法所特有的不同代码,因为该代码必须包含在共享代码的许多if、try和for语句的层级结构中。
是否可能将一个函数作为参数传递,然后在共享代码中运行该函数?或者有更好的处理方法吗?
我有一个类,它执行多个相似但不同的读写操作到一个Excel文件。所有这些操作都在不同的函数中定义。它们都必须包含在相同的长代码块中(检查和打开文件、保存、关闭等代码)。有没有合理的方法来避免每次重复这段代码呢? 问题是我不能只使用一个包含所有共享代码的方法,然后执行每个方法所特有的不同代码,因为该代码必须包含在共享代码的许多if、try和for语句的层级结构中。
是否可能将一个函数作为参数传递,然后在共享代码中运行该函数?或者有更好的处理方法吗?
聚焦实际问题:
是否可以将函数作为参数传递?
是的。使用 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)
或自定义委托类型。将参数声明为 Func(Of T)
或 Action(Of T)
。
使用哪个取决于您的方法签名。如果您告诉我们一个,我可以给您更精确的答案。
Func(Of T)
或Action(Of T)
。 - MarcinJuraszekAction
相当于 Sub
,而 Func
则相当于 Function
。至于参数,则取决于您在方法定义中如何定义它们。我建议将它们定义为 ByVal,这样会减少混淆,因为您没有显式调用该方法,并且无法保证执行时值的条件,因为这是使用反射框架来执行的。 - GoldBishop