Практическое руководство. Передача процедур другой процедуре в Visual BasicHow to: Pass Procedures to Another Procedure in Visual Basic

В этом примере показано, как использовать делегаты для передачи процедуры в другую процедуру.This example shows how to use delegates to pass a procedure to another procedure.

Делегат — это тип, который можно использовать как любой другой тип в Visual Basic.A delegate is a type that you can use like any other type in Visual Basic. AddressOfОператор возвращает объект делегата при применении к имени процедуры.The AddressOf operator returns a delegate object when applied to a procedure name.

Этот пример содержит процедуру с параметром делегата, который может принимать ссылку на другую процедуру, полученную с помощью AddressOf оператора.This example has a procedure with a delegate parameter that can take a reference to another procedure, obtained with the AddressOf operator.

Создание делегата и процедур сопоставленияCreate the delegate and matching procedures

  1. Создайте делегат с именем MathOperator .Create a delegate named MathOperator.

    Delegate Function MathOperator( 
        ByVal x As Double, 
        ByVal y As Double 
    ) As Double
    
  2. Создайте процедуру с именем AddNumbers с параметрами и возвращаемым значением, совпадающими с MathOperator , чтобы сигнатуры совпадали.Create a procedure named AddNumbers with parameters and return value that match those of MathOperator, so that the signatures match.

    Function AddNumbers( 
        ByVal x As Double, 
        ByVal y As Double 
    ) As Double
        Return x + y
    End Function
    
  3. Создайте процедуру с именем SubtractNumbers и соответствующей сигнатурой MathOperator .Create a procedure named SubtractNumbers with a signature that matches MathOperator.

    Function SubtractNumbers( 
        ByVal x As Double, 
        ByVal y As Double
    ) As Double
        Return x - y
    End Function
    
  4. Создайте процедуру с именем DelegateTest , которая принимает делегат в качестве параметра.Create a procedure named DelegateTest that takes a delegate as a parameter.

    Эта процедура может принять ссылку на AddNumbers или SubtractNumbers , поскольку их сигнатуры соответствуют MathOperator сигнатуре.This procedure can accept a reference to AddNumbers or SubtractNumbers, because their signatures match the MathOperator signature.

    Sub DelegateTest( 
        ByVal x As Double, 
        ByVal op As MathOperator, 
        ByVal y As Double 
    )
        Dim ret As Double
        ret = op.Invoke(x, y) ' Call the method.
        MsgBox(ret)
    End Sub
    
  5. Создайте процедуру с именем Test , которая вызывает DelegateTest один раз с делегатом для в AddNumbers качестве параметра и снова с делегатом для в SubtractNumbers качестве параметра.Create a procedure named Test that calls DelegateTest once with the delegate for AddNumbers as a parameter, and again with the delegate for SubtractNumbers as a parameter.

    Protected Sub Test()
        DelegateTest(5, AddressOf AddNumbers, 3)
        DelegateTest(9, AddressOf SubtractNumbers, 3)
    End Sub
    

    При Test вызове метода сначала отображается результат действия AddNumbers с 5 и 3 , который равен 8.When Test is called, it first displays the result of AddNumbers acting on 5 and 3, which is 8. Затем отображается результат работы функции SubtractNumbers 9 и 3 , что равно 6.Then the result of SubtractNumbers acting on 9 and 3 is displayed, which is 6.

См. такжеSee also