当函数在VB.Net中具有可变数量的参数时,将函数作为参数传递的高效实用方法?

问题描述 投票:0回答:1

我想建立一个对给定的数学函数进行运算的类。给定的数学函数可能很简单,也可能非常复杂,但始终具有:

  • 一个独立变量
  • 该变量的一个结果
  • 未知数,并且可能有大量常量

为了争辩,假设我只想打印这些函数的结果,实际上操作会很复杂(例如,迭代查找根)。

除了将可变数量的参数添加到字典之外,我不确定有其他更好的方法来实现此目的,这样我就可以始终将给定的函数作为委托传递。

这里是我所拥有的:

Sub RunTest()
    Dim myvars As New Dictionary(Of String, Double) From {
        {"a", 3},
        {"b", 2},
        {"c", 1},
        {"d", -1}
    }

    Dim MyTest1, MyTest2 As MyTestClass

    MyTest1 = New MyTestClass(AddressOf CubicTest, 1.123, myvars)
    MyTest2 = New MyTestClass(AddressOf QuadTest, 1.123, myvars)
    MyTest1.TestPrint()
    MyTest2.TestPrint()
End Sub

Function CubicTest(ByVal xAs Double, ByVal var As Dictionary(Of String, Double)) As Double
    Return var("a") * x^ 3 + var("b") * x^ 2 + var("c") * x + var("d")
End Function

Function QuadTest(ByVal xAs Double, ByVal var As Dictionary(Of String, Double)) As Double
    Return var("b") * x^ 2 + var("c") * x + var("d")
End Function

Class MyTestClass
    Private BaseFunction As FunctionByRef
    Private TestValue As Double
    Private Variables As Dictionary(Of String, Double)

    Delegate Function FunctionByRef(ByVal TestValue As Double, ByVal Variables As Dictionary(Of String, Double)) As Double

    Sub New(ByVal BaseFunction As FunctionByRef, ByVal TestValue As Double, ByVal Variables As Dictionary(Of String, Double))
        Me.BaseFunction = BaseFunction
        Me.TestValue = TestValue
        Me.Variables = Variables
    End Sub

    Sub TestPrint()
        Debug.Print(Me.BaseFunction(Me.TestValue, Me.Variables).ToString())
    End Sub

End Class

似乎工作正常,但也很笨重。

是否有更清洁的方法来完成此任务?

vb.net delegates
1个回答
0
投票

作为一般示例:

Private Sub ExecuteDoubleFunction(method As [Delegate], ParamArray args As Object())
    Dim result = DirectCast(method.DynamicInvoke(args), Double)

    'Use result here.
End Sub

然后,您可以将返回类型为Double的任何委托传递给该方法,并且可以将参数作为单个数组或离散值进行传递。这意味着您可以使用AddressOf为使用Lambda表达式的常规方法创建委托。

© www.soinside.com 2019 - 2024. All rights reserved.