Temsilciler (Visual Basic)

Temsilciler, yöntemlere başvuran nesnelerdir. Diğer programlama dillerinde kullanılan işlev işaretçilerine benzer olduklarından, bunlar bazen tür açısından güvenli işlev işaretçileri olarak tanımlanır. Ancak işlev işaretçilerinden farklı olarak, Visual Basic temsilcileri sınıfını System.Delegatetemel alan bir başvuru türüdür. Temsilciler hem paylaşılan yöntemlere ( sınıfın belirli bir örneği olmadan çağrılabilen yöntemlere) hem de örnek yöntemlerine başvurabilir.

Temsilciler ve Olaylar

Temsilciler, bir çağırma yordamı ile çağrılan yordam arasında bir aracıya ihtiyacınız olduğu durumlarda yararlıdır. Örneğin, olayları oluşturan bir nesnenin farklı koşullar altında farklı olay işleyicilerini çağırabilmesini isteyebilirsiniz. Ne yazık ki, olayları oluşturan nesne, belirli bir olayı hangi olay işleyicisinin işlediğinden önceden anlayamaz. Visual Basic deyimini kullanırken AddHandler sizin için bir temsilci oluşturarak olay işleyicilerini olaylarla dinamik olarak ilişkilendirmenize olanak tanır. Çalışma zamanında, temsilci çağrıları uygun olay işleyicisine iletir.

Kendi temsilcilerinizi oluşturabilmenize rağmen, çoğu durumda Visual Basic temsilciyi oluşturur ve ayrıntıları sizin yerinize halleder. Örneğin, bir Event deyim örtük olarak deyimini içeren Event sınıfının iç içe geçmiş sınıfı olarak adlandırılan <EventName>EventHandler ve olayla aynı imzaya sahip bir temsilci sınıfı tanımlar. deyimi AddressOf , belirli bir yordama başvuran bir temsilci örneğini örtük olarak oluşturur. Aşağıdaki iki kod satırı eşdeğerdir. İlk satırda, bağımsız değişken olarak gönderilen yöntemine Button1_Click başvuru içeren bir örneğinin EventHandleraçık bir şekilde oluşturulmasını görürsünüz. İkinci satır aynı şeyi yapmak için daha uygun bir yoldur.

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

Derleyicinin temsilcinin türünü bağlama göre belirleyebileceği her yerde temsilci oluşturmanın kısa yolunu kullanabilirsiniz.

Mevcut Temsilci Türünü Kullanan Olayları Bildirme

Bazı durumlarda, var olan bir temsilci türünü temel alınan temsilci olarak kullanmak üzere bir olay bildirmek isteyebilirsiniz. Aşağıdaki söz diziminde aşağıdakiler gösterilmiştir:

Delegate Sub DelegateType()
Event AnEvent As DelegateType

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

Temsilci Değişkenleri ve Parametreleri

Serbest iş parçacığı oluşturma gibi olayla ilgili olmayan diğer görevler için veya çalışma zamanında işlevlerin farklı sürümlerini çağırması gereken yordamlarla temsilciler kullanabilirsiniz.

Örneğin, araba adlarını içeren bir liste kutusu içeren sınıflandırılmış bir reklam uygulamanız olduğunu varsayalım. Reklamlar, normalde arabanın markasını oluşturan başlığa göre sıralanır. Bazı arabalar, otomobil yılından önce dahil edildiğinde karşılaşabileceğiniz bir sorun oluşur. Sorun, liste kutusunun yerleşik sıralama işlevinin yalnızca karakter kodlarına göre sıralanmış olmasıdır; önce tarihlerle başlayan tüm reklamları, ardından make ile başlayan reklamları yerleştirir.

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

AddressOf ve Lambda İfadeleri

Her temsilci sınıfı, bir nesne yönteminin belirtimini geçirilen bir oluşturucu tanımlar. Temsilci oluşturucus un bağımsız değişkeni bir yönteme veya lambda ifadesine başvuru olmalıdır.

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

AddressOf [expression.]methodName

derleme zamanı türü expression , bir sınıfın adı veya imzası temsilci sınıfının imzası ile eşleşen belirtilen adın yöntemini içeren bir arabirim olmalıdır. methodName paylaşılan bir yöntem veya örnek yöntemi olabilir. methodName sınıfının varsayılan yöntemi için bir temsilci oluştursanız bile isteğe bağlı değildir.

Lambda ifadesi belirtmek için aşağıdaki söz dizimini kullanın:

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

Aşağıdaki örnekte, bir temsilcinin başvuruyu belirtmek için kullanılan hem hem de AddressOf 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üyle eşleşmelidir. Lambda ifadeleri hakkında daha fazla bilgi için bkz. Lambda İfadeleri. Lambda ifadesi ve AddressOf temsilci atamalarına daha fazla örnek için 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öntemin temsilciyle nasıl ilişkilendirildiğini ve ardından temsilci aracılığıyla bu yöntemin nasıl çağrıldığını 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ş olmasa bile temsilcilere veya işleyicilere nasıl alt öğeler ve işlevler atayabileceğinizi açıklar
Ekinlikler Visual Basic'daki olaylara genel bir bakış sağlar.