Sdílet prostřednictvím


Delegáti (Visual Basic)

Delegáti jsou objekty, které odkazují na metody.Někdy označována jako ukazatele typu bezpečné funkci protože jsou podobné ukazatelů funkcí v jiných programovacích jazyků.Ale na rozdíl od funkce ukazatele Visual Basic jsou delegáti typ odkazu z třídy System.Delegate.Delegáti mohou odkazovat i sdílené metody – metody, které lze volat bez konkrétní instanci třídy – a instance metody.

Delegáti a události

Delegáti jsou užitečné v situacích, kdy jsou zapotřebí prostředník mezi volání procedury a postup volána.Můžete například objekt, který vyvolává události budete moci volat různé obslužné rutiny za různých okolností.Objekt zvyšování události nelze dopředu vědět, kterou obslužná rutina události je bohužel zpracování určité události.Visual Basicumožňuje dynamicky přidružení obslužné rutiny události vytvořením delegování, můžete při použití AddHandler prohlášení.Delegát za běhu předá volání příslušné obslužné rutiny.

Ačkoli ve většině případů lze vytvořit vlastní Delegáti Visual Basic vytvoří delegáta a zajišťuje vám podrobnosti.Například Event příkaz implicitně definuje třídu delegáta s názvem <EventName>EventHandler jako vnořené třídy obsahují třídy Event prohlášení a se stejným podpisem jako událost.AddressOf Implicitně vytvoří instanci delegát, který odkazuje na konkrétní postup.Následující dva řádky kódu jsou ekvivalentní.V prvním řádku viz explicitní vytváření instance Eventhandler, s odkazem na metodu Button1_Click jako argument.Na druhém řádku je výhodnější provést stejnou věc.

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 zjednodušený způsob vytváření Delegáti kdekoli kompilátoru můžete určit typ delegáta podle kontextu.

Deklaraci události, které používají existující typ delegáta.

V některých situacích můžete použít existující typ delegáta jako jeho základní delegát událost deklarovat.Následující syntaxe ukazuje jak:

Delegate Sub DelegateType()
Event AnEvent As DelegateType

To je užitečné, když chcete směrovat více událostí stejný popisovač.

Delegát proměnné a parametry

Delegáti můžete použít pro jiné, externími související úkoly, jako je například volného zřetězení nebo s postupy, které je třeba volat různé verze funkce při běhu.

Předpokládejme například, že máte zařazuje ad aplikace, která obsahuje seznam s názvy automobilů.Inzeráty jsou řazeny podle názvu, který je běžně značka automobilu.Problém, který může být vystaven vyvolá některých automobilů zahrnují rok automobilu před značku.Problém je, že funkce vestavěné řazení seznamu seřadí pouze podle kódů znaků; umístí všechny reklamy, první spuštění s daty, následovaný reklamy, počínaje značku.

Chcete-li tento problém odstranit, můžete vytvořit postup řazení ve třídě, která používá standardní abecední řazení na většinu seznamů, ale je možné přepínat za běhu vlastní řazení postupem pro reklamu na Auto.Provést předáte vlastní řazení postup řazení třídy za běhu pomocí delegáti.

AddressOf a Lambda výrazů

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

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

AddressOf [expression.]methodName

Typ kompilace expression musí být název třídy nebo rozhraní, které obsahuje metodu určený název, jehož podpis neodpovídá podpisu delegáta třídy.methodName Mohou být sdílené metody nebo metody instance.methodName Je povinný, i když vytvoříte delegáta pro výchozí metoda 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ýrazů lze určit odkaz 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

Podpis funkce musí být stejná jako typ delegáta.Další informace o výrazech lambda, viz Lambda výrazy (Visual Basic).Další příklady lambda výraz a AddressOf přiřazení delegátů, viz Převod uvolněné delegáta (Visual Basic).

Příbuzná témata

Title

Description

Jak: vyvolání metody delegáta (Visual Basic)

Poskytuje příklad, který ukazuje, jak přiřadit delegáta metodu a poté vyvolá metodu prostřednictvím delegáta.

Jak: postupy předat jiné procedury v jazyce Visual Basic

Ukazuje, jak použít delegáty předat jeden postup jiný postup.

Převod uvolněné delegáta (Visual Basic)

Popisuje, jak můžete přiřadit Nah a funkce delegáty nebo obsluhy i v případě, že jejich podpisy nejsou shodné

Události (Visual Basic)

Přehled událostí v jazyce Visual Basic.