Temsilciler (Visual Basic)

Temsilciler yöntemlere başvuran nesnelerdir. Bazen, diğer programlama dillerinde kullanılan işlev işaretçilerine benzer olduklarından tür açısından güvenli işlev işaretçileri olarak açıklanırlar. ancak işlev işaretçilerinden farklı olarak Visual Basic temsilciler, sınıfı temel alan bir başvuru türüdür System.Delegate . Temsilciler, her iki paylaşılan yönteme başvurabilir: bir sınıfın belirli bir örneği olmadan çağrılabilecek Yöntemler ve örnek yöntemleri.

Temsilciler ve Olaylar

Temsilciler, çağıran bir yordam ve çağrılan yordam arasında bir ara işlem yapmanız gereken durumlarda yararlıdır. Örneğin, olayları başlatan bir nesnenin farklı koşullarda farklı olay işleyicilerini çağırabilmesini isteyebilirsiniz. Ne yazık ki olayları oluşturan nesne, olay işleyicisinin belirli bir olayı işlemekte olduğu zamandan önce bilemez. Visual Basic, deyiminizi kullandığınızda sizin için bir temsilci oluşturarak olay işleyicilerini olaylar ile dinamik olarak ilişkilendirmenizi sağlar AddHandler . Çalışma zamanında, temsilci çağrıları uygun olay işleyicisine iletir.

kendi temsilcilerinizi oluşturabilseniz de çoğu durumda Visual Basic temsilciyi oluşturur ve sizin için ayrıntıları alır. Örneğin, bir Event ifade, <EventName>EventHandler ifadeyi içeren sınıfın iç içe yerleştirilmiş sınıfı olarak adlandırılan bir temsilci sınıfını Event ve olayla aynı imzayla birlikte tanımlar. AddressOfİfade, belirli bir yordama başvuran bir temsilci örneğini örtülü olarak oluşturur. Aşağıdaki iki kod satırı eşdeğerdir. İlk satırda, bir örneğinin açık oluşturulmasını EventHandler , Button1_Click bağımsız değişken olarak gönderilen metoda bir başvuru ile görürsünüz. İkinci satır, aynı şeyi yapmanın daha kolay bir yoludur.

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

Her yerde temsilci oluşturmak için kısayol yöntemini kullanabilirsiniz. derleyicinin, temsilcinin türünü bağlam tarafından belirleyebilmesi.

Var olan bir temsilci türünü kullanan olayları bildirme

Bazı durumlarda, temel aldığı temsilci olarak var olan bir temsilci türünü kullanmak üzere bir olay bildirmek isteyebilirsiniz. Aşağıdaki sözdizimi şunları göstermektedir:

Delegate Sub DelegateType()
Event AnEvent As DelegateType

Bu, birden çok olayı aynı işleyiciye yönlendirmek istediğinizde yararlıdır.

Değişkenleri ve parametreleri devretmek

Serbest iş parçacığı veya çalışma zamanında işlevlerin farklı sürümlerini çağırması gereken yordamlar gibi diğer olay dışı ilgili görevler için temsilcileri kullanabilirsiniz.

Örneğin, otomobillerin adlarını içeren bir liste kutusu içeren sınıflandırılmış bir ad uygulamanız olduğunu varsayalım. Reklamlar başlığa göre sıralanır, bu da normal olarak arabadır. Bir sorun ortaya çıktığında, bazı otomobillerin başından önce araba yılını içermesi durumunda meydana gelebilir. Sorun, liste kutusunun yerleşik sıralama işlevselliğinin yalnızca karakter kodlarına göre sıralama yaptığı bir sorundur; İlk önce tarihlerle başlayan tüm reklamları, sonra da Make ile başlayan reklamları koyar.

Bunu yapmak için, çoğu liste kutusunda standart alfabetik sıralamayı kullanan bir sınıfta sıralama yordamı oluşturabilirsiniz, ancak çalışma zamanında otomobil reklamları için özel sıralama yordamına geçiş yapabilir. Bunu yapmak için, özel sıralama yordamını, temsilciler kullanarak çalışma zamanında sıralama sınıfına geçitirsiniz.

AddressOf ve lambda Ifadeleri

Her temsilci sınıfı, bir nesne yönteminin belirtimini geçen bir oluşturucuyu tanımlar. Bir temsilci oluşturucusuna bağımsız değişken bir yönteme veya bir lambda ifadesine başvuru olmalıdır.

Bir yönteme başvuru belirtmek için aşağıdaki sözdizimini kullanın:

AddressOf [expression.]methodName

' In derleme zamanı türü, expression imzası temsilci sınıfının imzasıyla eşleşen belirtilen adda bir yöntemi içeren bir sınıfın veya arabirimin adı olmalıdır. , methodName Paylaşılan bir yöntem ya da bir örnek yöntemi olabilir. methodNameSınıfının varsayılan yöntemi için bir temsilci oluştursanız bile, bu isteğe bağlı değildir.

Bir lambda ifadesi belirtmek için aşağıdaki sözdizimini kullanın:

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

Aşağıdaki örnekte, AddressOf bir temsilcinin başvurusunu belirtmek için kullanılan hem hem de lambda ifadeleri gösterilmektedir.

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

İşlevin imzası, temsilci türü ile aynı olmalıdır. Lambda ifadeleri hakkında daha fazla bilgi için bkz. lambda ifadeleri. Lambda ifadesine ve temsilcilere atamalara daha fazla örnek için AddressOf bkz. gevşek temsilci dönüştürme.

Başlık Açıklama
Nasıl yapılır: Temsilci Yöntemi Çağırma Bir yöntemi bir temsilciyle ilişkilendirmeyi ve sonra bu yöntemi temsilci aracılığıyla çağırmayı gösteren bir örnek sağlar.
Nasıl yapılır: Visual Basic'de Başka Bir Yordama Yordam Geçirme Bir yordamı başka bir yordama geçirmek için temsilcilerin nasıl kullanılacağını gösterir.
Gevşek Temsilci Dönüştürme İmzaları özdeş olmadığında bile temsilcilerin veya işleyicilere nasıl alt ve işlev atayabileceğinizi açıklar
Ekinlikler Visual Basic olaylar için bir genel bakış sağlar.