Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A delegáltak metódusokra hivatkozó objektumok. Ezeket néha típusbiztos függvénymutatóknak is nevezik, mert hasonlóak a más programozási nyelvekben használt függvénymutatókhoz. A függvénymutatókkal ellentétben azonban a Visual Basic képviselők referenciatípusok, amelyek az osztály System.Delegate-án alapulnak. A meghatalmazottak hivatkozhatnak a megosztott metódusokra – az osztály egy adott példánya nélkül hívható metódusokra – és a példány metódusokra is.
Meghatalmazottak és események
A meghatalmazottak olyan helyzetekben hasznosak, amikor közvetítőre van szükség a hívási eljárás és a meghívott eljárás között. Előfordulhat például, hogy egy eseményt jelölő objektum különböző körülmények között különböző eseménykezelőket tud meghívni. Sajnos az eseményeket emelő objektum nem tudja előre, hogy melyik eseménykezelő kezel egy adott eseményt. A Visual Basic lehetővé teszi, hogy az eseménykezelőket dinamikusan társítsa az eseményekhez egy meghatalmazott létrehozásával, amikor az utasítást AddHandler használja. Futásidőben a meghatalmazott továbbítja a hívásokat a megfelelő eseménykezelőnek.
Bár létrehozhat saját meghatalmazottakat, a Legtöbb esetben a Visual Basic létrehozza a meghatalmazottat, és gondoskodik a részletekről. Például egy Event utasítás implicit módon definiál egy delegált osztályt <EventName>EventHandler néven, amely az Event osztály beágyazott osztálya, és ugyanazzal az aláírással rendelkezik, mint az esemény. Az AddressOf utasítás implicit módon létrehoz egy delegált példányt, amely egy adott eljárásra hivatkozik. A következő két kódsor egyenértékű. Az első sorban megmutatja egy EventHandler példány explicit létrehozását, a metódusnak küldött Button1_Click-ra mutató hivatkozással. A második sor kényelmesebb módja annak, hogy ugyanezt tegye.
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
A meghatalmazottak létrehozásának rövid módszerét használhatja bárhol, ahol a fordító meg tudja határozni a delegált típusát a környezet alapján.
Meglévő meghatalmazotttípust használó események deklarálása
Bizonyos esetekben előfordulhat, hogy egy eseményt úgy szeretne deklarálni, hogy egy meglévő delegálttípust használ alapul szolgáló meghatalmazottként. Az alábbi szintaxis bemutatja, hogyan:
Delegate Sub DelegateType()
Event AnEvent As DelegateType
Ez akkor hasznos, ha több eseményt szeretne ugyanarra a kezelőre irányítani.
Változók és paraméterek delegálása
Delegáltakat használhat más, nem eseményekkel kapcsolatos feladatokhoz, például ingyenes szálkezeléshez vagy olyan eljárásokhoz, amelyeknek futásidőben különböző függvényverziókat kell meghívnia.
Tegyük fel például, hogy van egy apróhirdetési alkalmazása, amely tartalmaz egy listadobozt az autók neveivel. A hirdetések cím szerint vannak rendezve, ami általában az autó márkája. Akkor fordulhat elő probléma, ha néhány autó esetében az évjáratot a márka neve elé helyezik. A probléma az, hogy a lista beépített rendezési funkciója csak karakterkódok szerint rendez; az összes hirdetést dátumokkal kezdődően helyezi el először, majd a hirdetéseket a készítéssel kezdődően.
A probléma megoldásához létrehozhat egy rendezési eljárást egy olyan osztályban, amely a szokásos betűrendet használja a legtöbb listamezőben, de futásidőben átválthat az autóhirdetések egyéni rendezési eljárására. Ehhez futásidőben átadja az egyéni rendezési eljárást a rendezési osztálynak, delegáltak használatával.
AddressOf és Lambda kifejezések
Minden delegált osztály meghatároz egy konstruktort, amely megfelel egy objektummetódus specifikációjának. A delegált konstruktor argumentumának egy metódusra vagy lambdakifejezésre való hivatkozásnak kell lennie.
Metódusra mutató hivatkozás megadásához használja a következő szintaxist:
AddressOf [expression.]methodName
A fordítási idejű típusnak expression egy osztály vagy egy interfész nevét kell tartalmaznia, amely a megadott névnek megfelelő metódust tartalmazza, és amelynek aláírása megegyezik a delegáló osztály aláírásával. Ez methodName lehet megosztott vagy példánymetódus. A methodName nem opcionális, még akkor sem, ha létrehoz egy delegátust az osztály alapértelmezett metódusához.
Lambda-kifejezés megadásához használja a következő szintaxist:
Function ([parm As type, parm2 As type2, ...]) expression
Az alábbi példa mind a AddressOf, mind a lambda kifejezéseket mutatja be, amelyeket a delegált hivatkozásának megadására használnak.
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
A függvény szignatúrájának meg kell egyeznie a delegált típuséval. További információ a lambdakifejezésekről: Lambda Expressions. További példák a lambda kifejezésekre és a delegáltakhoz való hozzárendelésekre: AddressOf.
Kapcsolódó témakörök
| Cím | Leírás |
|---|---|
| Útmutató: Delegálási metódus meghívása | Egy példa bemutatja, hogyan társíthat egy metódust egy meghatalmazotthoz, majd hogyan hívhatja meg ezt a metódust a meghatalmazotton keresztül. |
| Útmutató: Eljárások átadása egy másik eljáráshoz a Visual Basicben | Bemutatja, hogyan lehet átadni egy eljárást egy másik eljárásnak delegáltak használatával. |
| Lazított delegált konverzió | Azt ismerteti, hogyan rendelhet al- és függvényeket delegáltakhoz vagy kezelőkhöz akkor is, ha aláírásuk nem azonos |
| Események | Áttekintést nyújt a Visual Basic eseményeiről. |