Bagikan melalui


Struktur dan Kelas (Visual Basic)

Visual Basic menyatukan sintaks untuk struktur dan kelas, sehingga kedua entitas mendukung sebagian besar fitur yang sama. Namun, 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 tumpukan global.

Karena Anda tidak dapat mewarisi dari struktur, struktur harus digunakan hanya untuk objek yang tidak perlu diperpanjang. Gunakan struktur saat objek yang ingin Anda buat memiliki ukuran instans kecil, dan mempertimbangkan karakteristik performa kelas versus struktur.

Kesamaan

Struktur dan kelas serupa dalam hal-hal berikut:

  • Keduanya adalah jenis kontainer , yang berarti bahwa mereka berisi jenis lain sebagai anggota.

  • Keduanya memiliki anggota, yang dapat mencakup konstruktor, metode, properti, bidang, konstanta, enumerasi, peristiwa, dan penanganan peristiwa.

  • Anggota keduanya dapat memiliki tingkat akses individual. Misalnya, satu anggota dapat dideklarasikan Public dan anggota lainnya Private.

  • Keduanya dapat mengimplementasikan antarmuka.

  • Keduanya dapat memiliki konstruktor bersama, dengan atau tanpa parameter.

  • Keduanya dapat mengekspos properti default, asalkan properti tersebut membutuhkan setidaknya satu parameter.

  • Keduanya dapat mendeklarasikan dan menangani peristiwa, dan keduanya dapat mendeklarasikan delegasi.

Perbedaan

Struktur dan kelas berbeda dalam hal-hal berikut:

  • Struktur adalah jenis nilai; kelas adalah jenis referensi. Variabel bertipe struktur berisi data struktur, alih-alih berisi referensi ke data seperti tipe kelas.

  • Struktur menggunakan alokasi tumpukan; kelas menggunakan alokasi timbunan.

  • Semua elemen struktur adalah Public secara default; variabel dan konstanta kelas adalah Private secara default, sedangkan anggota kelas lainnya adalah Public secara default. Perilaku untuk anggota kelas ini memberikan kompatibilitas dengan sistem default Visual Basic 6.0.

  • Struktur harus memiliki setidaknya satu variabel yang tidak dibagi atau elemen peristiwa yang tidak dibagi, yang tidak kustom; kelas dapat sepenuhnya kosong.

  • Elemen struktur tidak dapat dideklarasikan sebagai Protected; anggota kelas dapat.

  • Prosedur struktur dapat menangani peristiwa hanya jika itu adalah prosedur SharedSub, dan hanya dengan menggunakan AddHandler Statement; prosedur kelas apa pun dapat menangani peristiwa, menggunakan kata kunci Handles atau pernyataan AddHandler. Untuk informasi selengkapnya, lihat Peristiwa.

  • Deklarasi variabel struktur tidak dapat menentukan penginisialisasi atau ukuran awal untuk array; deklarasi variabel kelas dapat.

  • Struktur secara implisit mewarisi dari kelas System.ValueType dan tidak dapat mewarisi dari tipe lain mana pun; kelas dapat mewarisi dari kelas lain mana pun kecuali System.ValueType.

  • Struktur tidak dapat diwariskan; kelas adalah.

  • Struktur tidak pernah dihentikan, sehingga runtime bahasa umum (CLR) tidak pernah memanggil metode Finalize pada struktur apa pun; kelas dihentikan oleh pengumpul sampah (GC), yang memanggil metode Finalize pada kelas saat mendeteksi bahwa tidak ada referensi aktif yang tersisa.

  • Struktur tidak memerlukan konstruktor; kelas tidak.

  • Struktur dapat memiliki konstruktor yang tidak dibagikan hanya jika mereka mengambil parameter; kelas dapat memilikinya dengan atau tanpa parameter.

Setiap struktur memiliki konstruktor publik implisit tanpa parameter. Konstruktor ini menginisialisasi semua elemen data struktur ke nilai defaultnya. Anda tidak dapat menentukan ulang perilaku ini.

Instans dan Variabel

Karena struktur adalah jenis nilai, setiap variabel struktur terikat secara permanen ke instans struktur individual. Tetapi kelas adalah jenis referensi, dan variabel objek dapat merujuk ke berbagai instans kelas pada waktu yang berbeda. Perbedaan ini memengaruhi penggunaan struktur dan kelas Anda dengan cara berikut:

  • Inisialisasi. Variabel struktur secara implisit mencakup inisialisasi elemen menggunakan konstruktor tanpa parameter struktur. Oleh karena itu, Dim s As struct1 setara dengan Dim s As struct1 = New struct1().

  • Menetapkan Variabel. Saat Anda menetapkan satu variabel struktur ke variabel lain, atau meneruskan instans struktur ke argumen prosedur, nilai saat ini dari semua elemen variabel disalin ke struktur baru. Saat Anda menetapkan satu variabel objek ke variabel lain, atau meneruskan variabel objek ke prosedur, hanya penunjuk referensi yang disalin.

  • Tidak menetapkan apa-apa. Anda dapat menetapkan nilai Tidak ada ke variabel struktur, tetapi instans terus dikaitkan dengan variabel. Anda masih dapat memanggil metodenya dan mengakses elemen datanya, meskipun 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 sampai Anda menetapkan instans lain ke dalamnya.

  • Beberapa Instans. Variabel objek dapat memiliki instans kelas yang berbeda yang ditetapkan padanya pada waktu yang berbeda, dan beberapa variabel objek dapat merujuk 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.

    Elemen struktur, bagaimanapun, diisolasi dalam instans mereka sendiri. Perubahan pada nilainya tidak tercermin dalam variabel struktur lainnya, bahkan dalam contoh lain dari deklarasi yang sama Structure .

  • Kesetaraan. Pengujian kesetaraan dua struktur harus dilakukan dengan pengujian elemen demi elemen. Dua variabel objek dapat dibandingkan menggunakan Equals metode . Equals menunjukkan apakah dua variabel menunjuk ke instans yang sama.

Lihat juga