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 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 Volný převod delegáta (Visual Basic).

Příbuzná témata

Title

Description

Postupy: Volá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.

Postupy: Předání procedur jiné proceduře v jazyce Visual Basic

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

Volný převod 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.