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.
Jenis generik adalah elemen pemrograman tunggal yang beradaptasi untuk melakukan fungsionalitas yang sama untuk beberapa jenis data. Saat Anda menentukan kelas atau prosedur umum, Anda tidak perlu menentukan versi terpisah untuk setiap jenis data yang mungkin ingin Anda lakukan fungsionalitas tersebut.
Analogi adalah set obeng dengan kepala yang bisa diganti. Anda memeriksa sekrup dan memilih kepala yang benar untuk sekrup itu (berlutut, bersilang, berbintang). Setelah Anda memasukkan kepala yang benar di handel obeng, Anda melakukan fungsi yang sama persis dengan obeng, yaitu memutar sekrup.
Saat Anda menentukan jenis generik, Anda membuat parameternya dengan satu atau beberapa jenis data. Parameter jenis memungkinkan kode untuk menyesuaikan jenis data dengan persyaratannya. Kode Anda dapat mendeklarasikan beberapa elemen pemrograman yang berbeda dari elemen generik, masing-masing bertindak pada sekumpulan jenis data yang berbeda. Tetapi elemen yang dideklarasikan semuanya melakukan logika yang identik, apa pun jenis data yang mereka gunakan.
Misalnya, Anda mungkin ingin membuat dan menggunakan kelas antrean yang beroperasi pada jenis data tertentu seperti String
. Anda dapat mendeklarasikan kelas seperti itu dari System.Collections.Generic.Queue<T>, seperti yang ditunjukkan contoh berikut.
Public stringQ As New System.Collections.Generic.Queue(Of String)
Anda sekarang dapat menggunakan stringQ
untuk bekerja secara eksklusif dengan nilai String
. Karena stringQ
khusus untuk String
alih-alih digeneralisasi untuk nilai Object
, Anda tidak memiliki pengikatan atau konversi jenis yang terlambat. Jenis generik menghemat waktu eksekusi dan mengurangi kesalahan run-time.
Untuk informasi selengkapnya tentang menggunakan jenis generik, lihat Cara: Menggunakan Kelas Generik.
Contoh kelas generik
Contoh berikut menunjukkan definisi kerangka kelas generik.
Public Class classHolder(Of t)
Public Sub processNewItem(ByVal newItem As t)
Dim tempItem As t
' Insert code that processes an item of data type t.
End Sub
End Class
Dalam kerangka sebelumnya, t
adalah parameter jenis , yaitu, tempat penampung untuk jenis data yang Anda berikan saat Anda mendeklarasikan kelas. Di tempat lain dalam kode Anda, Anda dapat mendeklarasikan berbagai versi classHolder
dengan menyediakan berbagai jenis data untuk t
. Contoh berikut menunjukkan dua deklarasi tersebut.
Public integerClass As New classHolder(Of Integer)
Friend stringClass As New classHolder(Of String)
Pernyataan sebelumnya mendeklarasikan kelas yang dibangun , di mana tipe tertentu menggantikan parameter tipe. Penggantian ini disebarluaskan ke seluruh kode dalam kelas yang dibangun. Contoh berikut menunjukkan seperti apa prosedur processNewItem
di integerClass
.
Public Sub processNewItem(ByVal newItem As Integer)
Dim tempItem As Integer
' Inserted code now processes an Integer item.
End Sub
Untuk contoh yang lebih lengkap, lihat Cara: Menentukan Kelas yang Dapat Menyediakan Fungsionalitas Identik pada Berbagai Jenis Data.
Elemen pemrograman yang memenuhi syarat
Anda dapat menentukan dan menggunakan kelas generik, struktur, antarmuka, prosedur, dan delegasi. .NET mendefinisikan beberapa kelas generik, struktur, dan antarmuka yang mewakili elemen generik yang umum digunakan. Namespace System.Collections.Generic menyediakan kamus, daftar, antrean, dan tumpukan. Sebelum menentukan elemen generik Anda sendiri, lihat apakah elemen tersebut sudah tersedia di System.Collections.Generic.
Prosedur bukan jenis, tetapi Anda dapat menentukan dan menggunakan prosedur generik. Lihat Prosedur Generik di Visual Basic.
Keuntungan tipe generik
Jenis generik berfungsi sebagai dasar untuk mendeklarasikan beberapa elemen pemrograman yang berbeda, yang masing-masing beroperasi pada jenis data tertentu. Alternatif untuk jenis generik adalah:
- Tipe tunggal yang beroperasi pada data jenis
Object
. - Sekumpulan versi spesifik dari jenis. Setiap versi dikodekan secara individual dan beroperasi pada satu jenis data tertentu seperti
String
,Integer
, atau jenis yang ditentukan pengguna seperticustomer
.
Jenis generik memiliki keuntungan berikut daripada alternatif ini:
- Jenis Keamanan. Tipe generik memastikan pengecekan tipe pada waktu kompilasi. Jenis berdasarkan
Object
menerima jenis data apa pun, dan Anda harus menulis kode untuk memeriksa apakah jenis data input dapat diterima. Dengan jenis generik, pengkompilasi dapat menangkap ketidakcocokan jenis sebelum run time. - Performa. Jenis generik tidak perlu memaketkan dan membongkar paket data, karena masing-masing dikhususkan untuk satu jenis data. Operasi yang berbasis pada
Object
harus melakukan pembungkusan data tipe input untuk mengubahnya menjadiObject
dan melakukan pembongkaran data yang ditujukan untuk output. Boxing dan unboxing mengurangi performa. Jenis yang didasarkan padaObject
juga di-bind secara dinamis, yang berarti bahwa mengakses anggota mereka memerlukan kode tambahan pada waktu kompilasi. Konversi jenis juga mengurangi performa. - Konsolidasi Kode. Kode dalam jenis generik harus didefinisikan hanya sekali. Sekumpulan versi jenis tertentu dari jenis harus mereplikasi kode yang sama di setiap versi, dengan satu-satunya perbedaan adalah jenis data tertentu untuk versi tersebut. Dengan jenis generik, semua versi khusus dari jenis tersebut dihasilkan dari jenis generik asli.
- Penggunaan Ulang Kode. Kode yang tidak bergantung pada jenis data tertentu dapat digunakan kembali dengan berbagai jenis data jika bersifat umum. Anda sering dapat menggunakannya kembali bahkan dengan jenis data yang awalnya tidak Anda prediksi.
- Dukungan IDE. Saat Anda menggunakan jenis yang dibangun yang dideklarasikan dari jenis generik, lingkungan pengembangan terintegrasi (IDE) dapat memberi Anda lebih banyak dukungan saat Anda mengembangkan kode Anda. Misalnya, IntelliSense dapat menunjukkan opsi khusus jenis untuk argumen ke konstruktor atau metode.
- Algoritma Generik. Algoritma abstrak yang tidak bergantung pada jenis adalah kandidat yang baik untuk tipe generik. Misalnya, prosedur generik yang mengurutkan item menggunakan antarmuka IComparable dapat digunakan dengan jenis data apa pun yang mengimplementasikan IComparable.
Kendala
Meskipun kode dalam definisi jenis generik harus se-independen mungkin, Anda mungkin perlu mensyaratkan kemampuan tertentu dari jenis data apa pun yang disediakan ke jenis generik Anda. Misalnya, jika Anda ingin membandingkan dua item untuk diurutkan atau disusun, jenis datanya harus menerapkan antarmuka IComparable. Anda dapat menerapkan persyaratan ini dengan menambahkan batasan ke parameter jenis.
Contoh batasan
Contoh berikut menunjukkan definisi kerangka kelas dengan batasan yang memerlukan argumen jenis untuk mengimplementasikan IComparable.
Public Class itemManager(Of t As IComparable)
' Insert code that defines class members.
End Class
Jika kode berikutnya mencoba membuat kelas dari itemManager
menyediakan jenis yang tidak menerapkan IComparable, pengkompilasi memberi sinyal kesalahan.
Jenis batasan
Batasan Anda dapat menentukan persyaratan berikut dalam kombinasi apa pun:
- Argumen jenis harus mengimplementasikan satu atau beberapa antarmuka
- Argumen jenis harus merupakan tipe atau mewarisi dari paling banyak satu kelas.
- Argumen jenis harus mengekspos konstruktor tanpa parameter yang dapat diakses oleh kode yang membuat objek darinya
- Argumen jenis harus berupa jenis referensi , atau harus merupakan jenis nilai
Kode C# dapat menyatakan bahwa argumen jenis harus merupakan jenis tidak terkelola. Visual Basic memberlakukan batasan ini untuk kode Visual Basic yang menggunakan jenis atau metode generik yang ditentukan dengan batasan ini (dalam C#). Namun, Anda tidak dapat mendeklarasikan batasan unmanaged
pada parameter jenis di Visual Basic.
Jika Anda perlu memberlakukan lebih dari satu persyaratan, Anda menggunakan daftar batasan yang dipisahkan koma di dalam kurung kurawal ({ }
). Untuk memerlukan konstruktor yang dapat diakses, Anda menyertakan kata kunci Operator Baru dalam daftar. Untuk memerlukan jenis referensi, Anda menyertakan kata kunci Class
; untuk memerlukan jenis nilai, Anda menyertakan kata kunci Structure
.
Untuk informasi selengkapnya tentang batasan, lihat Daftar Jenis.
Contoh beberapa batasan
Contoh berikut menunjukkan definisi kerangka kelas generik dengan daftar batasan pada parameter jenis. Dalam kode yang membuat instans kelas ini, argumen jenis harus mengimplementasikan antarmuka IComparable dan IDisposable, menjadi jenis referensi, dan mengekspos konstruktor tanpa parameter yang dapat diakses.
Public Class thisClass(Of t As {IComparable, IDisposable, Class, New})
' Insert code that defines class members.
End Class
Istilah penting
Jenis generik memperkenalkan dan menggunakan istilah berikut:
- Jenis Generik. Definisi kelas, struktur, antarmuka, prosedur, atau delegasi yang Anda berikan setidaknya satu jenis data saat Anda mendeklarasikannya.
- Jenis Parameter. Dalam definisi tipe generik, tempat penampung untuk tipe data yang Anda tentukan saat Anda mendeklarasikan tipenya.
- Tipe Argumen. Jenis data tertentu yang menggantikan parameter jenis saat Anda mendeklarasikan tipe yang dibentuk dari tipe generik.
- Batasan. Kondisi pada parameter jenis yang membatasi argumen jenis yang dapat Anda berikan untuknya. Batasan dapat mengharuskan argumen jenis menerapkan antarmuka tertentu, mewarisi dari kelas tertentu, memiliki konstruktor tanpa parameter yang dapat diakses, atau menjadi jenis referensi atau jenis nilai. Anda dapat menggabungkan batasan ini, tetapi Anda dapat menentukan paling banyak satu kelas dasar.
- Tipe Yang Dibuat. Kelas, struktur, antarmuka, prosedur, atau delegasi yang dideklarasikan dari jenis generik dengan menyediakan argumen jenis untuk parameter jenisnya.
Lihat juga
- Jenis Data
- Tipe Karakter
- Jenis Nilai dan Tipe Referensi
- Konversi Jenis di Visual Basic
- Jenis Data Pemecahan Masalah
- Jenis Data
- Dari
- Sebagai
- Tipe Data Objek
- Kovariansi dan Kontravariansi
- Iterator