Delegáti (Visual Basic)

Delegáti jsou objekty, které odkazují na metody. Jsou někdy popsány jako ukazatele funkce bezpečného typu , protože jsou podobné ukazatelům funkcí použitým v jiných programovacích jazycích. ale na rozdíl od ukazatelů na funkce Visual Basic delegáti jsou odkazový typ založený na třídě System.Delegate . Delegáti mohou odkazovat jak na sdílené metody – metody, které lze volat bez konkrétní instance třídy – a metody instance.

Delegáti a události

Delegáti jsou užitečné v situacích, kdy potřebujete prostředník mezi volající procedurou a procedurou, která je volána. Například může být vhodné, aby objekt, který vyvolává události, mohl volat různé obslužné rutiny událostí za různých okolností. Objekt, který vyvolává události, bohužel nemůže znát před časem, který obslužná rutina události zpracovává konkrétní událost. Visual Basic umožňuje dynamicky přidružit obslužné rutiny událostí s událostmi tím, že při použití příkazu vytvoří delegáta pro vás AddHandler . V době běhu delegát přesměruje volání příslušné obslužné rutiny události.

i když můžete vytvořit vlastní delegáty, ve většině případů Visual Basic vytvoří delegáta a postará o podrobnosti. Například Event příkaz implicitně definuje třídu delegáta s názvem <EventName>EventHandler jako vnořenou třídu třídy obsahující Event příkaz a se stejnou signaturou jako událost. AddressOfPříkaz implicitně vytvoří instanci delegáta, která odkazuje na konkrétní proceduru. Následující dva řádky kódu jsou ekvivalentní. Na prvním řádku se zobrazí explicitní vytvoření instance EventHandler s odkazem na metodu Button1_Click odeslanou jako argument. Druhým řádkem je pohodlnější způsob, jak to provést.

AddHandler Button1.Click, New EventHandler(AddressOf Button1_Click)
' The following line of code is shorthand for the previous line.
AddHandler Button1.Click, AddressOf Me.Button1_Click

Můžete použít zkrácený způsob vytváření delegátů kdekoli, kde kompilátor může určit typ delegáta v kontextu.

Deklarace událostí, které používají existující typ delegáta

V některých situacích může být vhodné deklarovat událost pro použití existujícího typu delegáta jako svého základního delegáta. Následující syntaxe ukazuje, jak:

Delegate Sub DelegateType()
Event AnEvent As DelegateType

To je užitečné, pokud chcete směrovat více událostí do stejné obslužné rutiny.

Proměnné a parametry delegáta

Delegáty můžete použít pro jiné úlohy, které nesouvisí s událostmi, jako je například volné zřetězení nebo s postupy, které potřebují volat různé verze funkcí za běhu.

Předpokládejme například, že máte aplikaci klasifikovanou jako službu AD, která obsahuje seznam s názvy automobilů. Reklamy jsou seřazeny podle názvu, což je obvykle značka auto. Problém, ke kterému může dojít, když některá osobní automobily před sebou zahrnuje rok auta. Problémem je, že vestavěná funkce řazení v poli seznamu seřadí pouze kódy znaků; umístí všechny reklamy počínaje počátečními daty a potom reklamy začínající na.

Chcete-li tento problém vyřešit, můžete vytvořit proceduru řazení ve třídě, která používá standardní abecední řazení ve většině polí seznamu, ale může přepnout v době běhu do vlastního postupu řazení pro inzeráty na automobil. Chcete-li to provést, předejte vlastní proceduru řazení do třídy řazení za běhu pomocí delegátů.

AddressOf a lambda výrazy

Každá třída delegáta definuje konstruktor, který je předán specifikaci metody objektu. Argument konstruktoru delegáta musí být odkazem na metodu nebo výraz lambda.

Chcete-li zadat odkaz na metodu, použijte následující syntaxi:

AddressOf [expression.]methodName

Typ doby kompilace expression musí být název třídy nebo rozhraní, které obsahuje metodu zadaného názvu, jejíž signatura odpovídá signatuře třídy delegáta. methodNameMůže se jednat o sdílenou metodu nebo metodu instance. methodNameNení volitelná, i když vytvoříte delegáta pro výchozí metodu třídy.

Chcete-li zadat výraz lambda, použijte následující syntaxi:

Function ([ parm As type , parm2 as type2 ,...]) expression

Následující příklad ukazuje jak AddressOf a lambda výrazy, které slouží k určení odkazu pro delegáta.

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
End Module

Signatura funkce musí odpovídat typu delegáta. Další informace o výrazech lambda naleznete v tématu lambda Expressions. Další příklady výrazů lambda a AddressOf přiřazení delegátům naleznete v tématu odlehčený převod delegáta.

Nadpis Popis
Postupy: Volání metody delegáta Poskytuje příklad, který ukazuje, jak přidružit metodu k delegátovi a následně tuto metodu vyvolat prostřednictvím delegáta.
Postupy: Předání procedur jiné proceduře v jazyce Visual Basic Ukazuje, jak použít delegáty k předání jednoho postupu jinému postupu.
Volný převod delegáta Popisuje, jak můžete přiřadit vlastníky a funkce delegátům nebo obslužným rutinám, i když jejich signatury nejsou stejné.
Události Poskytuje přehled událostí v Visual Basic.