在这个简单的委托示例中,我对数字比较缺少什么?

时间:2011-07-26 16:23:17

标签: vb.net delegates

我特别关注ShowInOrder方法,该方法已经传递了委托函数CompareNumbers。我想弄清楚到底发生了什么:

If compare(_num1, _num2) Then ...

这是完整的样本。任何帮助将不胜感激。

Module Module1

Sub Main()
    ' Create an instance of InOrderClass and assign values to the properties.
    ' InOrderClass method ShowInOrder displays the numbers in ascending 
    ' or descending order, depending on the comparison method you specify.
    Dim inOrder As New InOrderClass
    inOrder.Num1 = 5
    inOrder.Num2 = 4

    ' Use AddressOf to send a reference to the comparison function you want
    ' to use.
    inOrder.ShowInOrder(AddressOf GreaterThan)
    inOrder.ShowInOrder(AddressOf LessThan)

    ' Use lambda expressions to do the same thing.
    inOrder.ShowInOrder(Function(m, n) m > n)
    inOrder.ShowInOrder(Function(m, n) m < n)
End Sub

Function GreaterThan(ByVal num1 As Integer, ByVal num2 As Integer) As Boolean
    Return num1 > num2
End Function

Function LessThan(ByVal num1 As Integer, ByVal num2 As Integer) As Boolean
    Return num1 < num2
End Function

Class InOrderClass
    ' Define the delegate function for the comparisons.
    Delegate Function CompareNumbers(ByVal num1 As Integer, ByVal num2 As Integer) As Boolean
    ' Display properties in ascending or descending order.
    Sub ShowInOrder(ByVal compare As CompareNumbers)
        If compare(_num1, _num2) Then
            Console.WriteLine(_num1 & "  " & _num2)
        Else
            Console.WriteLine(_num2 & "  " & _num1)
        End If
    End Sub

    Private _num1 As Integer
    Property Num1() As Integer
        Get
            Return _num1
        End Get
        Set(ByVal value As Integer)
            _num1 = value
        End Set
    End Property

    Private _num2 As Integer
    Property Num2() As Integer
        Get
            Return _num2
        End Get
        Set(ByVal value As Integer)
            _num2 = value
        End Set
    End Property
End Class

结束模块

1 个答案:

答案 0 :(得分:0)

compare是指向函数的指针,在AddressOf获得的示例2中,通过创建lambda函数得到2。调用比较意味着将执行转移到指向的代码。该类执行例程,但不知道它是什么样的。唯一确定的是参数和返回值与变量的类型相匹配。