Prosedur Generik dalam Visual Basic
Prosedur generik, disebut juga metode generik, adalah prosedur yang ditentukan dengan setidaknya satu parameter jenis. Prosedur ini memungkinkan kode panggilan untuk menyesuaikan jenis data dengan persyaratannya setiap kali memanggil prosedur.
Prosedur dianggap tidak generik hanya karena didefinisikan dalam kelas generik atau struktur generik. Untuk menjadi generik, prosedur ini harus mengambil setidaknya satu parameter jenis, selain parameter normal yang mungkin diperlukan. Kelas atau struktur generik dapat berisi prosedur non-generik. Kelas, struktur, atau modul non-generik dapat berisi prosedur generik.
Prosedur generik dapat menggunakan parameter jenisnya dalam daftar parameter normalnya, dalam jenis pengembaliannya (jika ada), dan dalam kode prosedurnya.
Inferensi jenis
Anda dapat memanggil prosedur generik tanpa memberikan argumen jenis sama sekali. Jika dipanggil dengan cara seperti ini, pengkompilasi mencoba untuk menentukan jenis data yang sesuai untuk diteruskan ke argumen jenis prosedur. Hal ini disebut inferensi jenis. Kode berikut menunjukkan panggilan di mana pengkompilasi menyimpulkan bahwa pengkompilasi harus meneruskan jenis String
ke parameter jenis t
.
Public Sub testSub(Of t)(ByVal arg As t)
End Sub
Public Sub callTestSub()
testSub("Use this string")
End Sub
Jika pengkompilasi tidak dapat menyimpulkan jenis argumen dari konteks panggilan Anda, pengkompilasi tersebut melaporkan kesalahan. Salah satu kemungkinan penyebab kesalahan tersebut adalah ketidakcocokan peringkat array. Misalkan Anda menentukan parameter normal sebagai array parameter jenis. Jika Anda memanggil prosedur generik yang menyediakan array dari peringkat yang berbeda (jumlah dimensi), ketidakcocokan ini menyebabkan kegagalan inferensi jenis. Kode berikut menunjukkan panggilan di mana array dua dimensi diteruskan ke prosedur yang mengharapkan array satu dimensi.
Public Sub demoSub(Of t)(ByVal arg() As t)
End Sub
Public Sub callDemoSub()
Dim twoDimensions(,) As Integer
demoSub(twoDimensions)
End Sub
Anda dapat memanggil inferensi jenis hanya dengan menghilangkan semua argumen jenis. Jika Anda menawarkan satu jenis argumen, Anda harus menyediakan semuanya.
Inferensi jenis hanya didukung untuk prosedur generik. Anda tidak dapat memanggil inferensi jenis pada kelas, struktur, antarmuka, atau delegasi generik.
Contoh
Deskripsi
Contoh berikut mendefinisikan prosedur generik Function
untuk menemukan elemen tertentu dalam array. Contoh ini mendefinisikan satu parameter jenis dan menggunakannya untuk membangun dua parameter dalam daftar parameter.
Kode
Public Function findElement(Of T As IComparable) (
ByVal searchArray As T(), ByVal searchValue As T) As Integer
If searchArray.GetLength(0) > 0 Then
For i As Integer = 0 To searchArray.GetUpperBound(0)
If searchArray(i).CompareTo(searchValue) = 0 Then Return i
Next i
End If
Return -1
End Function
Komentar
Contoh sebelumnya memerlukan kemampuan untuk membandingkan searchValue
dengan setiap elemen searchArray
. Untuk menjamin kemampuan ini, parameter jenis T
terbatas untuk mengimplementasikan antarmuka IComparable<T>. Kode tersebut menggunakan metode CompareTo dan bukan operator =
, karena tidak ada jaminan bahwa argumen jenis yang disediakan untuk T
mendukung operator =
.
Anda dapat menguji prosedur findElement
dengan kode berikut.
Public Sub tryFindElement()
Dim stringArray() As String = {"abc", "def", "xyz"}
Dim stringSearch As String = "abc"
Dim integerArray() As Integer = {7, 8, 9}
Dim integerSearch As Integer = 8
Dim dateArray() As Date = {#4/17/1969#, #9/20/1998#, #5/31/2004#}
Dim dateSearch As Date = Microsoft.VisualBasic.DateAndTime.Today
MsgBox(CStr(findElement(Of String)(stringArray, stringSearch)))
MsgBox(CStr(findElement(Of Integer)(integerArray, integerSearch)))
MsgBox(CStr(findElement(Of Date)(dateArray, dateSearch)))
End Sub
Panggilan sebelumnya ke MsgBox
masing-masing menampilkan "0", "1", dan "-1".
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk