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.
Související témata
| 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. |