Udostępnij za pośrednictwem


Delegaty (Visual Basic)

Obiekty delegowane są obiekty, które odwołują się do metody.Czasami są one opisane jako wskaźników funkcji bezpiecznego typu , ponieważ są one podobne do wskaźników funkcji używanych w innych językach programowania.Jednak w przeciwieństwie do wskaźników funkcji Visual Basic delegatów jest typem odwołania, oparty na klasie Delegate.Pełnomocnicy można odwoływać się obie metody udostępnionego — metody, które mogą być wywołane bez konkretnego wystąpienia klasy — i metody instancji.

Delegatów i wydarzenia

Obiekty delegowane są przydatne w sytuacjach, gdy konieczne jest pośrednikiem pomiędzy wywołanie procedury i wywoływanej procedury.Na przykład może być obiekt, który informuje o zdarzeniach, aby móc wywoływać programy obsługi zdarzeń różne w różnych okolicznościach.Niestety obiektu, podnoszenie, zdarzenia nie wie z wyprzedzeniem, którego program obsługi zdarzeń jest obsługa określonego zdarzenia.Visual Basicumożliwia obsługę zdarzeń dynamicznie stowarzyszonych ze zdarzeniami przez tworzenie na pełnomocnika, korzystając z AddHandler instrukcji.W czasie wykonywania pełnomocnik przesyła dalej wywołań obsługi zdarzeń właściwe.

Chociaż można tworzyć własne delegatów, w większości przypadków Visual Basic tworzy delegata i zajmuje się szczegóły dla Ciebie.Na przykład Event instrukcji niejawnie definiuje klasę obiektu delegowanego, o nazwie <EventName>EventHandler jako zagnieżdżony klasy zawierających klasy Event instrukcji i z samych sygnaturach zdarzenia.AddressOf Instrukcji niejawnie tworzy wystąpienie obiektu delegowanego, który odnosi się do szczególnej procedury.Następujące dwa wiersze kodu są równoważne.W pierwszym wierszu są Zobacz jawne utworzenie wystąpienia Eventhandler, z odniesieniem do metody Button1_Click wysyłane jako argumentu.Drugi wiersz jest bardziej wygodnym sposobem zrobić to samo.

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

Można użyć składni skróconej sposób tworzenia kompilator delegatów w dowolnym miejscu można określić typ delegata w kontekście.

Deklarowanie zdarzenia, które użyć istniejącego typu obiektu delegowanego

W niektórych sytuacjach można zadeklarować zdarzenie, aby użyć istniejącego typu obiektu delegowanego jako jego podstawowego obiektu delegowanego.Następującej składni demonstruje, jak:

Delegate Sub DelegateType()
Event AnEvent As DelegateType

Jest to przydatne, gdy chcesz rozesłać wiele zdarzeń do tej samej procedury obsługi.

Pełnomocnik zmiennych i parametrów

Można używać delegatów na inne, niepowiązane ze zdarzeniami związanych zadań, takich jak wolnych wątków lub procedurami, które trzeba wywoływać różne wersje funkcji w czasie wykonywania.

Załóżmy na przykład, aplikacja ad sklasyfikowane, która zawiera pole listy z nazwami samochodów.Reklamy są sortowane według tytułu, który jest zwykle marki samochodu.Problem, który mogą napotykać występuje, gdy niektóre samochody obejmują rok przed marka samochodu.Problemem jest to, że funkcje wbudowane sortowania pola listy sortuje tylko przez kody znaków; umieszcza wszystkie reklamy, począwszy od daty najpierw, następuje reklamy, począwszy od make.

Aby rozwiązać ten problem, można utworzyć procedurę sortowania w klasie, która używa standardowego sortowanie alfabetyczne w większości pól list, ale jest możliwość przełączania się w czasie wykonywania procedury sortowanie niestandardowe dla samochodów reklam.Aby to zrobić, można przekazać procedury sortowanie niestandardowe klasy sortowania w czasie wykonywania, za pomocą delegatów.

AddressOf i wyrażenia Lambda

Każda klasa obiektu delegowanego definiuje konstruktora, który jest przekazywany specyfikacji metody obiektu.Argument do konstruktora obiektu delegowanego musi być odwołaniem do metody lub wyrażenie lambda.

Aby określić odniesienie do metody, należy użyć następującej składni:

AddressOf [expression.]methodName

Typ kompilacji, expression musi być nazwą klasy lub interfejs, który zawiera metodę o określonej nazwie, w których podpis nie pasuje do podpisu klasy obiektu delegowanego.methodName Może być udostępniony metoda lub metody instancji.methodName Nie jest opcjonalny, nawet jeśli utworzyć obiektu delegowanego dla domyślnej metody klasy.

Aby określić wyrażenie lambda, należy użyć następującej składni:

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

W poniższym przykładzie pokazano zarówno AddressOf i wyrażenia lambda służy do określania odniesienia dla pełnomocnika.

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 funkcji musi być zgodny z typem obiektu delegowanego.Aby uzyskać więcej informacji na temat wyrażeń lambda, zobacz Lambda — Wyrażenia (Visual Basic).Aby uzyskać więcej przykładów wyrażenie lambda i AddressOf Zobacz przydziały do pełnomocników, Swobodna konwersja delegatów (Visual Basic).

Tematy pokrewne

Tytuł

Opis

Porady: wywoływanie metody delegata (Visual Basic)

Zawiera przykład pokazuje, jak skojarzyć metodę z pełnomocnika, a następnie wywołania metody poprzez pełnomocnika.

Porady: przekazywanie procedur do innej procedury w Visual Basic

Demonstruje, jak używać delegatów do przekazywania jedną procedurę do innej procedury.

Swobodna konwersja delegatów (Visual Basic)

W tym artykule opisano, jak można przypisać Podprocedura i funkcje delegatów lub obsługi nawet w przypadku, gdy ich podpisy nie są identyczne

Zdarzenia (Visual Basic)

Omówienie zdarzeń w języku Visual Basic.