Aracılığıyla paylaş


Temsilciler (Visual Basic)

Temsilciler, yöntemlere başvuran nesnelerdir. Diğer programlama dillerinde kullanılan işlev işaretçilerine benzer olduklarından, bazen tür açısından güvenli işlev işaretçileri olarak tanımlanırlar. 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öntemler) hem de örnek yöntemlerine başvurabilir.

Temsilciler ve Olaylar

Temsilciler, çağıran yordam ile çağrılan yordam arasında bir aracıya ihtiyaç duyduğunuz durumlarda yararlıdır. Örneğin, olayları tetikleyen 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, AddHandler deyimini kullandığınızda sizin için otomatik olarak bir temsilci oluşturarak olay işleyicilerini olaylarla dinamik olarak ilişkilendirmenizi sağlar. Ç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 bildirimi, <EventName>EventHandler ifadesini içeren sınıfın iç içe geçmiş bir sınıfı olarak, olayla aynı imzaya sahip olan ve Event adı verilen bir temsilci sınıfını doğrudan belirler. AddressOf deyimi, 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, yönteme EventHandler başvurusu bağımsız değişken olarak gönderilen bir Button1_Click örneğinin açık bir şekilde oluşturulduğunu görürsünüz. İkinci satır da 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ü altındaki temsilci olarak kullanmak üzere bir olay bildirmek isteyebilirsiniz. Aşağıdaki söz diziminde nasıl yapıldığını gösterilmektedir:

Delegate Sub DelegateType()
Event AnEvent As DelegateType

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

Değişkenleri ve Parametreleri Temsilci Olarak Atama

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 bir sınıflandırılmış reklam uygulamanız olduğunu varsayalım. Reklamlar, normalde otomobilin markası olan başlığa göre sıralanır. Bazı otomobiller, otomobilin markasından önceki yılını içerdiğ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 da 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. Bu işlemi yapmak için, özel sıralama yordamını çalışma zamanında temsilciler aracılığıyla 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şturucuya yönelik bağımsız değişken, 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şvurusunu belirtmek için hem AddressOf hem de lambda ifadelerinin kullanımı 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 uyumlu olmalıdır. 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'te Yordamları Başka Bir Yordama Geçirme Bir yordamı başka bir yordama geçirmek için temsilcilerin nasıl kullanılacağını gösterir.
Esnek Delege Dönüştürme İmzaları aynı olmasa bile temsilcilere veya işleyicilere nasıl alt öğeler ve işlevler atayabileceğinizi açıklar
Etkinlikler Visual Basic'teki olaylara genel bir bakış sağlar.