Делегат — это переменная ссылочного типа, которая содержит ссылку на метод. Ссылка может быть изменена во время выполнения. F # делегаты аналогичны указателям на функции в C или C ++.
Объявление делегатов
Объявление делегата определяет методы, на которые может ссылаться делегат. Делегат может ссылаться на метод, имеющий такую же подпись, как и у делегата.
Синтаксис для объявления делегата —
type delegate-typename = delegate of type1 -> type2
Например, рассмотрим делегатов —
// Delegate1 works with tuple arguments. type Delegate1 = delegate of (int * int) -> int // Delegate2 works with curried arguments. type Delegate2 = delegate of int * int -> int
Оба делегата могут использоваться для ссылки на любой метод, который имеет два параметра типа int и возвращает переменную типа int .
В синтаксисе —
-
type1 представляет тип аргумента (ов).
-
type2 представляет тип возвращаемого значения.
type1 представляет тип аргумента (ов).
type2 представляет тип возвращаемого значения.
Пожалуйста, обратите внимание —
-
Типы аргументов автоматически каррируются.
-
Делегаты могут быть присоединены к значениям функций, а также к статическим методам или методам экземпляра.
-
Значения функции F # могут передаваться непосредственно в качестве аргументов для делегирования конструкторов.
-
Для статического метода делегат вызывается с использованием имени класса и метода. Для метода экземпляра используются имя экземпляра объекта и метод.
-
Метод Invoke для типа делегата вызывает инкапсулированную функцию.
-
Кроме того, делегаты могут быть переданы в качестве значений функции, ссылаясь на имя метода Invoke без скобок.
Типы аргументов автоматически каррируются.
Делегаты могут быть присоединены к значениям функций, а также к статическим методам или методам экземпляра.
Значения функции F # могут передаваться непосредственно в качестве аргументов для делегирования конструкторов.
Для статического метода делегат вызывается с использованием имени класса и метода. Для метода экземпляра используются имя экземпляра объекта и метод.
Метод Invoke для типа делегата вызывает инкапсулированную функцию.
Кроме того, делегаты могут быть переданы в качестве значений функции, ссылаясь на имя метода Invoke без скобок.
Следующий пример демонстрирует концепцию —
пример
type Myclass() = static member add(a : int, b : int) = a + b static member sub (a : int) (b : int) = a - b member x.Add(a : int, b : int) = a + b member x.Sub(a : int) (b : int) = a - b // Delegate1 works with tuple arguments. type Delegate1 = delegate of (int * int) -> int // Delegate2 works with curried arguments. type Delegate2 = delegate of int * int -> int let InvokeDelegate1 (dlg : Delegate1) (a : int) (b: int) = dlg.Invoke(a, b) let InvokeDelegate2 (dlg : Delegate2) (a : int) (b: int) = dlg.Invoke(a, b) // For static methods, use the class name, the dot operator, and the // name of the static method. let del1 : Delegate1 = new Delegate1( Myclass.add ) let del2 : Delegate2 = new Delegate2( Myclass.sub ) let mc = Myclass() // For instance methods, use the instance value name, the dot operator, // and the instance method name. let del3 : Delegate1 = new Delegate1( mc.Add ) let del4 : Delegate2 = new Delegate2( mc.Sub ) for (a, b) in [ (400, 200); (100, 45) ] do printfn "%d + %d = %d" a b (InvokeDelegate1 del1 a b) printfn "%d - %d = %d" a b (InvokeDelegate2 del2 a b) printfn "%d + %d = %d" a b (InvokeDelegate1 del3 a b) printfn "%d - %d = %d" a b (InvokeDelegate2 del4 a b)
Когда вы компилируете и запускаете программу, она выдает следующий вывод: