Основы VB.NET Урок 27. Делегаты в VB.NET
Делегаты можно представлять себе как переменные, в которых можно хранить некоторые функции. Как в переменную типа Integer мы можем записать некоторое целое число, так и в делегат можно записать некоторую функцию.
Делегаты различаются по типам. Тип делегата определяется типом и количеством параметров функции, а также возвращаемым функцией значения. Таким образом, если мы определим делегат как имеющий, например, два параметра типа Integer, и возвращающий значение типа Boolean, то такому делегату мы сможем присвоить только функцию, принимающую два целых параметра и возвращающую значение булевского типа.
Вот пример использовани делегата:
'Объявление делегата
Delegate Function y(ByVal x As Int32) As Single
Module Test
'Объявление нескольких функций
Function y1(ByVal x As Int32) As Single
Return x * x
End Function
Function y2(ByVal x As Int32) As Single
Return Math.Sqrt(x)
End Function
Function y3(ByVal x As Int32) As Single
Return Math.Pow(x, x)
End Function
Sub main()
Dim f As y 'Объявление переменной типа делегата
Dim a As Int32
Console.WriteLine("Какую функцию будем обрабатывать?")
Console.WriteLine("1. y=x*x")
Console.WriteLine("2. y=sqrt(x)")
Console.WriteLine("3. y=x^x")
a = CInt(Console.ReadLine())
Select Case a
Case 1
'Записываем в делегат функцию y1
f = AddressOf y1
Case 2
'Записываем в делегат функцию y2
f = AddressOf y2
Case 3
'Записываем в делегат функцию y3
f = AddressOf y3
End Select
'Суммируем функцию в точках 1, 2, ..., 10
Dim i As Int32
Dim sum As Single = 0
For i = 1 To 10
sum += f(i)
Next
Console.WriteLine("Сумма равна {0}", sum)
End Sub
End Module
Как вы видите, мы объявляем делегат с одним параметром целого типа и возвращающий вещественное значение. Это мы делаем в строчке:
Delegate Function y(ByVal x As Int32) As Single
...
Далее мы в нашем модуле Test определяем несколько функций, которые имеют ту же сигнатуру, что и делегат т. е. принимают один параметра целого типа и возвращающих значеие вещественного типа). Это функции y1, y2, y3. Кроме того, мы обявляем переменную f типа нашего делегата y. Затем, в зависимости от выбора пользователя, мы записываем в f ту или иную функцию:
...
f = AddressOf y1
...
Т. е. в зависимости от выбора пользователя f будет или функцией y1, или y2, или y3.
Далее мы суммируем значение делегата f в при значениях параметра равным 1, 2, ..., 10 и выводим результат на экран. В зависимости от того, что пользователь выбрал, наша программа покажет или 385
, или 22,46828, или 1.040507E+10.
Напоследок отметим, что вместо записи
...
f = AddressOf y1
...
можно писать
...
f = New y(AddressOf y1)
...
|