Struktur dan Kelas (Visual Basic)
Visual Basic menyatukan sintaksis untuk struktur dan kelas, dengan hasil kedua entitas mendukung sebagian besar fitur yang sama. Akan tetapi, ada juga perbedaan penting antara struktur dan kelas.
Kelas memiliki keuntungan menjadi jenis referensi — meneruskan referensi lebih efisien daripada meneruskan variabel struktur dengan semua datanya. Di sisi lain, struktur tidak memerlukan alokasi memori pada timbunan global.
Karena Anda tidak dapat mewarisi dari struktur, struktur harus digunakan hanya untuk objek yang tidak perlu diperluas. Gunakan struktur saat objek yang ingin Anda buat memiliki ukuran instans kecil, dan pertimbangkan karakteristik performa kelas versus struktur.
Kesamaan
Struktur dan kelas serupa dalam hal-hal berikut:
Keduanya adalah jenis kontainer, yang berarti keduanya berisi jenis lain sebagai anggota.
Keduanya memiliki anggota, yang dapat mencakup konstruktor, metode, properti, bidang, konstanta, enumerasi, peristiwa, dan penanganan aktivitas.
Anggota keduanya dapat memiliki tingkat akses individual. Misalnya, satu anggota dapat dinyatakan
Public
dan yang lainPrivate
.Keduanya dapat menerapkan antarmuka.
Keduanya dapat memiliki konstruktor bersama, dengan atau tanpa parameter.
Keduanya dapat memaparkan properti default, asalkan properti tersebut mengambil setidaknya satu parameter.
Keduanya dapat menyatakan dan memunculkan peristiwa, dan keduanya dapat menyatakan delegasi.
Perbedaan
Struktur dan kelas berbeda dalam hal-hal berikut:
Struktur merupakan jenis nilai; kelas merupakan jenis referensi. Variabel jenis struktur berisi data struktur, dan bukan berisi referensi ke data seperti yang dilakukan oleh jenis kelas.
Struktur menggunakan alokasi tumpukan; kelas menggunakan alokasi timbunan.
Semua elemen struktur adalah
Public
secara default; variabel dan konstanta kelas adalahPrivate
secara default, sementara anggota kelas lainnya adalahPublic
secara default. Perilaku untuk anggota kelas ini menyediakan kompatibilitas dengan sistem default Visual Basic 6.0.Struktur harus memiliki setidaknya satu variabel nonbersama atau elemen peristiwa nonbersama, nonkustom; kelas dapat sepenuhnya kosong.
Elemen struktur tidak dapat dinyatakan sebagai
Protected
; anggota kelas dapat.Prosedur struktur dapat menghandel peristiwa hanya jika ia adalah prosedur Bersama
Sub
, dan hanya menggunakan Pernyataan AddHandler; prosedur kelas apa pun dapat menghandel peristiwa, dengan menggunakan kata kunci Handel atau pernyataanAddHandler
. Untuk informasi selengkapnya, lihat Peristiwa.Deklarasi variabel struktur tidak dapat menentukan penginisialisasi atau ukuran awal untuk array; deklarasi variabel kelas dapat.
Struktur secara tersirat mewarisi dari kelas System.ValueType dan tidak dapat mewarisi dari jenis lain; kelas dapat mewarisi dari kelas apa pun atau kelas selain System.ValueType.
Struktur tidak dapat diwariskan; kelas dapat.
Struktur tidak pernah diakhiri, sehingga runtime bahasa umum (CLR) tidak pernah memanggil metode Finalize pada struktur apa pun; kelas diakhiri oleh pengumpul sampah (GC), yang memanggil Finalize pada kelas saat mendeteksi tidak ada referensi aktif yang tersisa.
Struktur tidak memerlukan konstruktor; kelas sebaliknya.
Struktur dapat memiliki konstruktor nonbersama hanya jika mengambil parameter; kelas dapat memilikinya dengan atau tanpa parameter.
Setiap struktur memiliki konstruktor publik tersirat tanpa parameter. Konstruktor ini menginisialisasi semua elemen data struktur ke nilai defaultnya. Anda tidak dapat menentukan ulang perilaku ini.
Instans dan Variabel
Karena struktur merupakan jenis nilai, setiap variabel struktur secara permanen terikat ke instans struktur individual. Tetapi kelas adalah jenis referensi, dan variabel objek dapat mengacu ke berbagai instans kelas pada berbagai waktu. Perbedaan ini memengaruhi penggunaan struktur dan kelas Anda dengan cara berikut:
Inisialisasi. Variabel struktur secara tersirat menyertakan inisialisasi elemen menggunakan konstruktor tanpa parameter struktur. Oleh karena itu,
Dim s As struct1
setara denganDim s As struct1 = New struct1()
.Penetapan Variabel. Ketika Anda menetapkan satu variabel struktur ke yang lain, atau meneruskan instans struktur ke argumen prosedur, nilai saat ini dari semua elemen variabel disalin ke struktur baru. Ketika Anda menetapkan satu variabel objek ke yang lain, atau meneruskan variabel objek ke prosedur, hanya penunjuk referensi yang disalin.
Penetapan Tidak Ada. Anda dapat menetapkan nilai Tidak Ada ke variabel struktur, tetapi instans terus dikaitkan dengan variabel. Anda masih dapat memanggil metodenya dan mengakses elemen datanya, meski elemen variabel diinisialisasi ulang oleh penugasan.
Sebaliknya, jika Anda mengatur variabel objek ke
Nothing
, Anda memisahkannya dari instans kelas apa pun, dan Anda tidak dapat mengakses anggota apa pun melalui variabel hingga Anda menetapkan instans lain ke sana.Beberapa Instans. Variabel objek dapat memiliki berbagai instans kelas yang ditetapkan untuknya pada berbagai waktu, dan beberapa variabel objek dapat mengacu ke instans kelas yang sama secara bersamaan. Perubahan yang Anda buat pada nilai anggota kelas memengaruhi anggota tersebut saat diakses melalui variabel lain yang menunjuk ke instans yang sama.
Akan tetapi, elemen struktur terisolasi dalam instansnya sendiri. Perubahan pada nilainya tidak tercermin dalam variabel struktur lainnya, bahkan dalam instans lain dari deklarasi
Structure
yang sama.Kesetaraan. Pengujian kesetaraan dua struktur harus dilakukan dengan pengujian elemen demi elemen. Dua variabel objek dapat dibandingkan menggunakan metode Equals. Equals menunjukkan apakah dua variabel menunjuk ke instans yang sama.