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 |
---|---|
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. |
Popisuje, jak můžete přiřadit Nah a funkce delegáty nebo obsluhy i v případě, že jejich podpisy nejsou shodné |
|
Přehled událostí v jazyce Visual Basic. |