Megosztás a következőn keresztül:


Meghatalmazottak (Visual Basic)

A meghatalmazottak 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 Visual Basic delegáltak az osztályon System.Delegatealapuló referenciatípusok. A meghatalmazottak hivatkozhatnak a megosztott metódusokra – az osztály egy adott példánya nélkül meghívható metódusokra – és a példánymetórán 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 olyan objektumot szeretne, amely eseményeket hoz létre, hogy különböző körülmények között különböző eseménykezelőket hívhasson meg. Sajnos az eseményeket növelő objektum nem tudja előre, hogy melyik eseménykezelő kezeli az adott eseményt. Visual Basic lehetővé teszi, hogy az eseménykezelőket dinamikusan társítsa az eseményekhez egy delegált létrehozásával az AddHandler utasítás használatakor. 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 Visual Basic létrehozza a meghatalmazottat, és gondoskodik a részletekről. Egy utasítás például Event implicit módon definiálja az utasítást tartalmazó Event osztály beágyazott osztályaként elnevezett <EventName>EventHandler delegált osztályt, és ugyanazzal az aláírással, mint az esemény. Az AddressOf utasítás implicit módon létrehoz egy delegált egy példányát, amely egy adott eljárásra hivatkozik. Az alábbi két kódsor egyenértékű. Az első sorban egy példány EventHandlerexplicit létrehozása látható, az argumentumként küldött metódusra Button1_Click 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ó meghatározhatja a delegált típusát a környezet alapján.

Meglévő meghatalmazotttípust használó események deklarálása

Bizonyos esetekben érdemes lehet deklarálni egy eseményt, hogy egy meglévő delegálttípust használjon mögöttes delegáltké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 besorolt hirdetésalkalmazása, amely tartalmaz egy listamezőt az autók nevével. A hirdetések cím szerint vannak rendezve, ami általában az autóé. A probléma akkor fordulhat elő, ha néhány autó tartalmazza az év az autó, mielőtt a make. A probléma az, hogy a lista beépített rendezési funkciója csak karakterkódok szerint rendezi a listát; az összes hirdetést dátumokkal kezdődően helyezi el először, majd a hirdetéseket a make-vel kezdődően.

Ennek kijavításához létrehozhat egy rendezési eljárást egy olyan osztályban, amely a legtöbb listamezőben a szabványos betűrendet használja, de futásidőben átválthat az autóhirdetések egyéni rendezési eljárására. Ehhez az egyéni rendezési eljárást futtatáskor átadja a rendezési osztálynak meghatalmazottak használatával.

AddressOf és Lambda kifejezések

Minden delegált osztály definiál egy konstruktort, amely megfelel egy objektummetódus specifikációjának. A delegált konstruktor argumentumának metódusra vagy lambda kifejezésre való hivatkozásnak kell lennie.

Metódusra mutató hivatkozás megadásához használja az alábbi szintaxist:

AddressOf [expression.]methodName

A fordítási idő típusának expression egy osztálynak vagy interfésznek kell lennie, amely a megadott név olyan metódusát tartalmazza, amelynek aláírása megegyezik a delegált osztály aláírásával. Ez methodName lehet megosztott vagy példánymetódus. Ez methodName nem kötelező, még akkor sem, ha létrehoz egy delegáltat az osztály alapértelmezett metódusához.

Lambda-kifejezés megadásához használja az alábbi szintaxist:

Function ([parm As type, parm2 As type2, ...]) expression

Az alábbi példa a meghatalmazott hivatkozásának megadására használt lambda kifejezéseket is AddressOf bemutatja.

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 aláírásának meg kell egyeznie a delegált típuséval. További információ a lambda kifejezésekről: Lambda Expressions. További példák a lambda kifejezésre és AddressOf a meghatalmazottakhoz való hozzárendelésekre: Nyugodt delegálás.

Cím Leírás
Útmutató: Delegált metódus meghívása Egy példát mutat be, amely 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 másik eljárásnak a Visual Basic Bemutatja, hogyan adhat át egy eljárást egy másik eljárásnak meghatalmazottak használatával.
Delegáltkonvertálási ellaz Azt ismerteti, hogyan rendelhet al- és függvényeket delegáltakhoz vagy kezelőkhöz akkor is, ha az aláírásuk nem azonos
Események Áttekintést nyújt a Visual Basic eseményeiről.