Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Delegasi adalah objek yang merujuk pada metode. Mereka kadang-kadang digambarkan sebagai penunjuk fungsi jenis aman karena mirip dengan penunjuk fungsi yang digunakan dalam bahasa pemrograman lainnya. Tetapi tidak seperti penunjuk fungsi, delegasi Visual Basic adalah jenis referensi berdasarkan kelas System.Delegate. Delegasi dapat mereferensikan kedua metode bersama — metode yang dapat dipanggil tanpa instans kelas tertentu — dan metode instans.
Delegasi dan Peristiwa
Delegasi berguna dalam situasi di mana Anda memerlukan perantara antara prosedur panggilan dan prosedur yang dipanggil. Misalnya, Anda mungkin ingin objek yang menaikkan peristiwa dapat memanggil penanganan aktivitas yang berbeda dalam keadaan yang berbeda. Sayangnya, objek yang memunculkan acara tidak dapat mengetahui sebelumnya handler acara mana yang menangani acara tertentu. Visual Basic memungkinkan Anda mengaitkan penanganan aktivitas secara dinamis dengan peristiwa dengan membuat delegasi untuk Anda saat Anda menggunakan pernyataan tersebut AddHandler . Pada waktu proses, delegasi meneruskan panggilan ke penanganan aktivitas yang sesuai.
Meskipun Anda dapat membuat delegasi Anda sendiri, dalam kebanyakan kasus Visual Basic membuat delegasi dan mengurus detail untuk Anda. Misalnya, Event sebuah pernyataan secara implisit mendefinisikan kelas delegasi bernama <EventName>EventHandler sebagai kelas dalam dari kelas yang berisi Event pernyataan, dan dengan tanda tangan yang sama dengan event. Pernyataan AddressOf secara implisit membuat contoh dari delegasi yang mengacu pada prosedur tertentu. Dua baris kode berikut setara. Di baris pertama, Anda melihat pembuatan eksplisit instans EventHandler, dengan referensi ke metode Button1_Click yang dikirim sebagai argumen. Baris kedua adalah cara yang lebih nyaman untuk melakukan hal yang sama.
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
Anda dapat menggunakan cara singkat untuk membuat delegasi di mana saja pengkompilasi dapat menentukan jenis delegasi berdasarkan konteks.
Mendeklarasikan Peristiwa yang Menggunakan Jenis Delegasi yang Sudah Ada
Dalam beberapa situasi, Anda mungkin ingin mendeklarasikan peristiwa untuk menggunakan jenis delegasi yang sudah ada sebagai delegasi dasarnya. Sintaks berikut menunjukkan caranya:
Delegate Sub DelegateType()
Event AnEvent As DelegateType
Ini berguna ketika Anda ingin merutekan beberapa peristiwa ke handler yang sama.
Mendelegasikan Variabel dan Parameter
Anda dapat menggunakan deleget untuk tugas lain yang tidak terkait dengan peristiwa, seperti penguliran bebas atau dengan prosedur yang perlu memanggil versi fungsi yang berbeda saat waktu eksekusi.
Misalnya, Anda memiliki aplikasi iklan klasifikasi yang menyertakan kotak daftar dengan nama mobil. Iklan diurutkan berdasarkan judul, yang biasanya merupakan buatan mobil. Masalah yang mungkin Anda hadapi terjadi ketika beberapa mobil mencantumkan tahun mobil sebelum merek mobil. Masalahnya adalah bahwa fungsionalitas pengurutan bawaan dari kotak daftar hanya mengurutkan menurut kode karakter; ini menempatkan semua iklan yang dimulai dengan tanggal terlebih dahulu, diikuti oleh iklan yang dimulai dengan mereknya.
Untuk memperbaikinya, Anda dapat membuat prosedur pengurutan di kelas yang menggunakan pengurutan alfabet standar pada sebagian besar kotak daftar, tetapi dapat beralih pada waktu proses ke prosedur pengurutan kustom untuk iklan mobil. Untuk melakukan ini, Anda meneruskan prosedur pengurutan kustom ke kelas pengurutan saat runtime, menggunakan delegate.
Ekspresi AddressOf dan Lambda
Setiap kelas delegasi mendefinisikan konstruktor yang diteruskan spesifikasi metode objek. Argumen ke konstruktor delegasi harus menjadi referensi ke metode, atau ekspresi lambda.
Untuk menentukan referensi ke metode, gunakan sintaks berikut:
AddressOf [expression.]methodName
Jenis waktu kompilasi expression harus berupa nama kelas atau antarmuka yang berisi metode nama yang ditentukan yang tanda tangannya cocok dengan tanda tangan kelas delegasi.
methodName dapat berupa metode bersama atau metode instans.
methodName bukan pilihan, bahkan jika Anda membuat delegasi untuk metode bawaan kelas.
Untuk menentukan ekspresi lambda, gunakan sintaks berikut:
Function ([parm Sebagai type, parm2 Sebagai type2, ...]) expression
Contoh berikut menunjukkan baik AddressOf dan ekspresi lambda yang digunakan untuk menentukan referensi untuk delegat.
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
Penandatangan fungsi harus sesuai dengan tipe delegasi. Untuk informasi selengkapnya tentang ekspresi lambda, lihat Ekspresi Lambda. Untuk lebih banyak contoh ekspresi lambda dan AddressOf penugasan kepada delegasi, lihat Konversi Delegasi Yang Dilonggarkan.
Topik Terkait
| Judul | Deskripsi |
|---|---|
| Cara: Memanggil Metode Delegasi | Memberikan contoh yang menunjukkan cara mengaitkan metode dengan delegasi lalu memanggil metode tersebut melalui delegasi. |
| Cara: Meneruskan Prosedur ke Prosedur Lain di Visual Basic | Menunjukkan cara menggunakan delegasi untuk meneruskan satu prosedur ke prosedur lain. |
| Konversi Delegasi Yang Dilonggarkan | Menjelaskan bagaimana Anda dapat menetapkan subs dan fungsi untuk mendelegasikan atau menangani bahkan ketika tanda tangan mereka tidak identik |
| Peristiwa | Menyediakan gambaran umum peristiwa di Visual Basic. |