Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Delegáti jsou objekty, které odkazují na metody. Někdy jsou popsány jako ukazatele na funkce bezpečné pro typ , protože se podobají ukazatelům funkcí používaným v jiných programovacích jazycích. Na rozdíl od ukazatelů na funkce jsou však delegáti jazyka Visual Basic referenčním typem založeným na třídě System.Delegate. Delegáti mohou odkazovat na obě 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 zprostředkovatele mezi volající procedurou a volanou procedurou. Můžete například potřebovat objekt, který vyvolává události, aby mohl za různých okolností volat různé obslužné rutiny. Objekt, který vyvolává události, bohužel nemůže předem vědět, 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í k událostem vytvořením delegáta za vás při použití AddHandler příkazu. Za běhu delegát přesměruje volání na příslušný obslužný program události.
I když můžete vytvořit vlastní delegáty, Visual Basic ve většině případů vytvoří delegáta a postará se o podrobnosti za vás. Například Event příkaz implicitně definuje delegovanou třídu pojmenovanou <EventName>EventHandler jako vnořenou třídu třídy obsahující Event příkaz a se stejným podpisem jako událost. Příkaz AddressOf vytvoří implicitně instanci delegáta, který odkazuje na konkrétní proceduru. Následující dva řádky kódu jsou ekvivalentní. Na prvním řádku uvidíte explicitní vytvoření instance , EventHandlers odkazem na metodu Button1_Click poslanou jako argument. Druhý řádek je pohodlnější způsob, jak udělat totéž.
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
Zkrácený způsob vytváření delegátů můžete použít kdekoli, kde může kompilátor určit typ delegáta podle kontextu.
Deklarace událostí, které používají existující typ delegáta
V některých situacích můžete chtít deklarovat událost, která použije stávající typ 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é, když chcete směrovat více událostí do stejné obslužné rutiny.
Delegování proměnných a parametrů
Delegáty můžete použít pro jiné úlohy, které nesouvisejí s událostmi, jako je volné vlákno nebo u postupů, které za běhu potřebují volat různé verze funkcí.
Předpokládejme například, že máte aplikaci pro inzeráty, která obsahuje seznam s názvy aut. Reklamy jsou seřazené podle názvu, což je obvykle název auta. K problému může dojít, když některé auta zahrnují rok auta před zahájením výroby. Problémem je, že integrovaná funkce řazení seznamového pole řadí pouze podle kódů znaků; umísťuje všechny reklamy začínající datem jako první, a následují reklamy začínající názvem značky.
Chcete-li tento problém vyřešit, můžete vytvořit postup řazení ve třídě, která používá standardní abecední řazení ve většině polí seznamu, ale je schopen přepnout v době běhu na vlastní postup řazení pro reklamy v autě. Uděláte to tak, že vlastní metodu řazení předáte třídě řazení během chodu programu pomocí delegátů.
Výrazy AddressOf a Lambda
Každá třída delegáta definuje konstruktor, kterému je předána specifikace metody objektu. Argument konstruktoru delegáta musí být odkaz na metodu nebo výraz lambda.
Pokud chcete zadat odkaz na metodu, použijte následující syntaxi:
AddressOf [expression.]methodName
Typ expression během kompilace musí být názvem třídy nebo rozhraní, které obsahuje metodu se zadaným názvem, jejíž podpis odpovídá podpisu delegátního typu.
methodName může být buď sdílenou metodou nebo metodou instance.
methodName není volitelný, i když vytvoříte delegáta pro výchozí metodu třídy.
Pokud chcete 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, tak výrazy lambda použité 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
Podpis funkce se musí shodovat s typem delegáta. Další informace o výrazech lambda najdete v tématu Výrazy lambda. Další příklady výrazů lambda a přiřazení k delegátům naleznete v tématu AddressOf.
Související témata
| Titulek | Popis |
|---|---|
| Jak na to: Vyvolání metody delegáta | Poskytuje příklad, který ukazuje, jak přidružit metodu k delegátu a pak vyvolat danou metodu prostřednictvím delegáta. |
| Postupy: Předání procedur jinému postupu v jazyce Visual Basic | Ukazuje, jak pomocí delegátů předat jeden postup do jiné procedury. |
| Volný převod delegáta | Popisuje, jak můžete přiřazovat procedury a funkce delegátům nebo obslužným programům, i když jejich podpisy nejsou identické. |
| Události | Poskytuje přehled událostí v jazyce Visual Basic. |