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.
Prosedur generik, juga disebut metode generik, adalah prosedur yang ditentukan dengan setidaknya satu parameter jenis. Ini memungkinkan kode panggilan untuk menyesuaikan jenis data dengan persyaratannya setiap kali memanggil prosedur.
Prosedur tidak menjadi generik hanya karena didefinisikan di dalam kelas atau struktur generik. Agar generik, prosedur harus mengambil setidaknya satu parameter jenis, selain parameter normal lainnya yang mungkin dibutuhkan. Kelas atau struktur generik dapat berisi prosedur nongenerik, dan kelas, struktur, atau modul nongenerik dapat berisi prosedur generik.
Prosedur generik dapat menggunakan parameter jenisnya dalam daftar parameter normalnya, dalam jenis pengembaliannya jika memilikinya, dan dalam kode prosedurnya.
Inferensi Jenis
Anda dapat memanggil prosedur generik tanpa menyediakan argumen jenis apa pun sama sekali. Jika Anda menyebutnya dengan cara ini, pengkompilasi mencoba menentukan jenis data yang sesuai untuk diteruskan ke argumen jenis prosedur. Ini disebut inferensi jenis. Kode berikut menunjukkan sebuah panggilan di mana pengkompilasi menyimpulkan bahwa ia 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 argumen jenis dari konteks panggilan Anda, ia melaporkan kesalahan. Salah satu kemungkinan penyebab kesalahan tersebut adalah ketidakcocokan peringkat array. Misalnya, Anda menetapkan parameter normal sebagai array dengan jenis parameter tertentu. Jika Anda memanggil prosedur generik yang menyediakan array peringkat yang berbeda (jumlah dimensi), ketidakcocokan menyebabkan inferensi jenis gagal. 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 hanya dapat memanggil inferensi jenis dengan menghilangkan semua argumen jenis. Jika Anda menyediakan satu argumen jenis, Anda harus menyediakan semuanya.
Inferensi jenis hanya didukung untuk prosedur generik. Anda tidak dapat memanggil inferensi jenis pada kelas generik, struktur, antarmuka, atau delegasi.
Contoh
Deskripsi
Contoh berikut mendefinisikan prosedur generik Function
untuk menemukan elemen tertentu dalam array. 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, ia membatasi jenis parameter T
untuk mengimplementasikan antarmuka IComparable<T>. Kode menggunakan metode CompareTo alih-alih operator =
, karena tidak ada jaminan bahwa argumen jenis yang disediakan untuk T
mendukung operator =
.
Anda dapat menguji findElement
prosedur 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 untuk MsgBox
menampilkan masing-masing "0", "1", dan "-1".