progs.biz  
Начало>VB.NET>Основы>Урок 27
C#
VB.NET
Visual C++.NET
ASP.NET
Visual C++ 6
WinAPI
C/C++
Delphi
C++ Builder
Java
SQL
PHP
DirectX
Visual Basic 6.0
Ассемблер
Интернет
Сист. прогр-ние
Pocket PC
Обзор книг
Обзор программ

Джон Коннелл. Разработка элементов управления Microsoft .NET на Microsoft Visual Basic .NET
Джон Коннелл. Разработка элементов управления Microsoft .NET на Microsoft Visual Basic .NET
Заказать на Озоне



Яндекс-цитирования

Основы 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)
    ...
Рассылки нашего сайта на Subscribe.Ru
Visual C++, MFC
C# и .NET
VB.NET
ASP.NET new!
Win API
C/C++
Delphi
Java
HTML, PHP, mySQL, WEB-дизайн
Flash MX
C++ Builder
Ассемблер
SQL Server
DirectX
Обзор книг
Обзор программ
Новости сайта progs.biz


 
 
Копирование любых материалов сайта без разрешения авторов и владельцев сайта запрещено.
© 2002-2008 сайт progs.biz
© 2002-2008 Игорь Алексеев