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 EventHandler
açı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.
İlgili Konular
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. |