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.
Visual Basic mendukung jenis anonim, yang memungkinkan Anda membuat objek tanpa menulis definisi kelas untuk jenis data. Sebagai gantinya, pengkompilasi menghasilkan kelas untuk Anda. Kelas tidak memiliki nama yang dapat digunakan, mewarisi langsung dari Object, dan berisi properti yang Anda tentukan dalam mendeklarasikan objek. Karena nama jenis data tidak ditentukan, nama tersebut disebut sebagai jenis anonim.
Contoh berikut mendeklarasikan dan membuat variabel product
sebagai instans jenis anonim yang memiliki dua properti, Name
dan Price
.
' Variable product is an instance of a simple anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}
Ekspresi kueri menggunakan tipe anonim untuk menggabungkan kolom data yang dipilih oleh kueri. Anda tidak dapat menentukan jenis hasil terlebih dahulu, karena Anda tidak dapat memprediksi kolom yang mungkin dipilih kueri tertentu. Jenis anonim memungkinkan Anda menulis kueri yang memilih sejumlah kolom, dalam urutan apa pun. Pengkompilasi membuat jenis data yang cocok dengan properti yang ditentukan dan urutan yang ditentukan.
Dalam contoh berikut, products
adalah daftar objek produk, yang masing-masing memiliki banyak properti. Variabel namePriceQuery
memegang definisi kueri yang, saat dijalankan, mengembalikan kumpulan instans jenis anonim yang memiliki dua properti, Name
dan Price
.
Dim namePriceQuery = From prod In products
Select prod.Name, prod.Price
Variabel nameQuantityQuery
memegang definisi kueri yang, saat dijalankan, mengembalikan kumpulan instans jenis anonim yang memiliki dua properti, Name
dan OnHand
.
Dim nameQuantityQuery = From prod In products
Select prod.Name, prod.OnHand
Untuk informasi selengkapnya tentang kode yang dibuat oleh pengompilasi untuk jenis anonim, lihat Definisi Jenis Anonim.
Perhatian
Nama jenis anonim dihasilkan oleh pengompilasi dan dapat bervariasi setiap kali kompilasi. Kode Anda tidak boleh menggunakan atau mengandalkan nama jenis anonim karena nama mungkin berubah saat proyek dikompilasi ulang.
Mendeklarasikan Tipe Anonim
Deklarasi instans jenis anonim menggunakan daftar inisialisasi untuk menentukan properti jenis. Anda hanya dapat menentukan properti saat mendeklarasikan jenis anonim, bukan elemen kelas lain seperti metode atau peristiwa. Dalam contoh berikut, product1
adalah instans jenis anonim yang memiliki dua properti: Name
dan Price
.
' Variable product1 is an instance of a simple anonymous type.
Dim product1 = New With {.Name = "paperclips", .Price = 1.29}
' -or-
' product2 is an instance of an anonymous type with key properties.
Dim product2 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Jika Anda menunjuk properti sebagai properti utama, Anda dapat menggunakannya untuk membandingkan dua instans jenis anonim untuk kesetaraan. Namun, nilai properti kunci tidak dapat diubah. Lihat bagian Properti Kunci nanti dalam topik ini untuk informasi selengkapnya.
Perhatikan bahwa mendeklarasikan instans jenis anonim seperti mendeklarasikan instans jenis bernama dengan menggunakan penginisialisasi objek:
' Variable product3 is an instance of a class named Product.
Dim product3 = New Product With {.Name = "paperclips", .Price = 1.29}
Untuk informasi selengkapnya tentang cara lain untuk menentukan properti jenis anonim, lihat Cara: Menyimpulkan Nama dan Jenis Properti dalam Deklarasi Tipe Anonim.
Sifat Utama
Properti kunci berbeda dari properti non-kunci dengan beberapa cara mendasar:
Hanya nilai properti kunci yang dibandingkan untuk menentukan apakah dua instans sama.
Nilai properti kunci bersifat baca-saja dan tidak dapat diubah.
Hanya nilai properti kunci yang disertakan dalam algoritma kode hash yang dihasilkan kompilator untuk jenis anonim.
Kesetaraan
Instans jenis anonim hanya dapat sama jika merupakan instans dengan jenis anonim yang sama. Pengkompilasi memperlakukan dua instans sebagai instans dengan jenis yang sama jika memenuhi kondisi berikut:
Mereka dinyatakan dalam rakitan yang sama.
Properti mereka memiliki nama yang sama, jenis yang disimpulkan yang sama, dan dideklarasikan dalam urutan yang sama. Perbandingan nama tidak sensitif terhadap huruf besar/kecil.
Properti yang sama di masing-masing ditandai sebagai properti kunci.
Setidaknya satu properti dalam setiap deklarasi adalah properti kunci.
Instans jenis anonim yang tidak memiliki properti kunci hanya sama dengan dirinya sendiri.
' prod1 and prod2 have no key values.
Dim prod1 = New With {.Name = "paperclips", .Price = 1.29}
Dim prod2 = New With {.Name = "paperclips", .Price = 1.29}
' The following line displays False, because prod1 and prod2 have no
' key properties.
Console.WriteLine(prod1.Equals(prod2))
' The following statement displays True because prod1 is equal to itself.
Console.WriteLine(prod1.Equals(prod1))
Dua instans dengan jenis anonim yang sama sama jika nilai properti kuncinya sama. Contoh berikut menggambarkan bagaimana kesetaraan diuji.
Dim prod3 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Dim prod4 = New With {Key .Name = "paperclips", Key .Price = 1.29}
' The following line displays True, because prod3 and prod4 are
' instances of the same anonymous type, and the values of their
' key properties are equal.
Console.WriteLine(prod3.Equals(prod4))
Dim prod5 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Dim prod6 = New With {Key .Name = "paperclips", Key .Price = 1.29,
.OnHand = 423}
' The following line displays False, because prod5 and prod6 do not
' have the same properties.
Console.WriteLine(prod5.Equals(prod6))
Dim prod7 = New With {Key .Name = "paperclips", Key .Price = 1.29,
.OnHand = 24}
Dim prod8 = New With {Key .Name = "paperclips", Key .Price = 1.29,
.OnHand = 423}
' The following line displays True, because prod7 and prod8 are
' instances of the same anonymous type, and the values of their
' key properties are equal. The equality check does not compare the
' values of the non-key field.
Console.WriteLine(prod7.Equals(prod8))
Nilai Read-Only
Nilai properti kunci tidak dapat diubah. Misalnya, dalam prod8
contoh sebelumnya, bidang Name
dan Price
adalah read-only
, tetapi OnHand
dapat diubah.
' The following statement will not compile, because Name is a key
' property and its value cannot be changed.
' prod8.Name = "clamps"
' OnHand is not a Key property. Its value can be changed.
prod8.OnHand = 22
Tipe Anonim dari Ekspresi Kueri
Ekspresi kueri tidak selalu memerlukan pembuatan tipe anonim. Jika memungkinkan, mereka menggunakan jenis yang sudah ada untuk menyimpan data kolom. Ini terjadi ketika kueri mengembalikan seluruh rekaman dari sumber data, atau hanya satu bidang dari setiap rekaman. Dalam contoh kode berikut, customers
adalah kumpulan objek kelas Customer
. Kelas memiliki banyak properti, dan Anda dapat menyertakan satu atau beberapa properti dalam hasil kueri, dalam urutan apa pun. Dalam dua contoh pertama, tidak ada jenis anonim yang diperlukan karena kueri memilih elemen dari jenis bernama:
custs1
berisi kumpulan string, karenacust.Name
merupakan string.Dim custs1 = From cust In customers Select cust.Name
custs2
berisi kumpulanCustomer
objek, karena setiap elemencustomers
adalahCustomer
objek, dan seluruh elemen dipilih oleh kueri.Dim custs2 = From cust In customers Select cust
Namun, tipe dengan nama yang sesuai tidak selalu tersedia. Anda mungkin ingin memilih nama dan alamat pelanggan untuk satu tujuan, nomor ID pelanggan dan lokasi untuk yang lain, dan nama pelanggan, alamat, dan riwayat pesanan untuk yang ketiga. Jenis anonim memungkinkan Anda memilih kombinasi properti apa pun, dalam urutan apa pun, tanpa terlebih dahulu mendeklarasikan jenis bernama baru untuk menyimpan hasilnya. Sebaliknya, kompilator membuat jenis anonim untuk setiap kompilasi properti. Kueri berikut hanya memilih nama pelanggan dan nomor ID dari setiap Customer
objek di customers
. Oleh karena itu, pengompilasi membuat jenis anonim yang hanya berisi dua properti tersebut.
Dim custs3 = From cust In customers
Select cust.Name, cust.ID
Nama dan jenis data properti dalam jenis anonim diambil dari argumen ke Select
, cust.Name
dan cust.ID
. Properti dalam tipe anonim yang dibuat oleh kueri selalu merupakan properti kunci. Ketika custs3
dijalankan dalam perulangan berikut For Each
, hasilnya adalah kumpulan instans jenis anonim dengan dua properti kunci, Name
dan ID
.
For Each selectedCust In custs3
Console.WriteLine(selectedCust.ID & ": " & selectedCust.Name)
Next
Elemen dalam koleksi yang diwakili oleh custs3
bertipe kuat, dan Anda dapat menggunakan IntelliSense untuk menjelajahi properti yang tersedia dan untuk memverifikasi tipe mereka.
Untuk informasi selengkapnya, lihat Pengenalan LINQ di Visual Basic.
Memutuskan Apakah Akan Menggunakan Tipe Anonim
Sebelum Anda membuat objek sebagai instans kelas anonim, pertimbangkan apakah itu opsi terbaik. Misalnya, jika Anda ingin membuat objek sementara untuk berisi data terkait, dan Anda tidak perlu bidang dan metode lain yang mungkin berisi kelas lengkap, jenis anonim adalah solusi yang baik. Jenis anonim juga nyaman jika Anda menginginkan pilihan properti yang berbeda untuk setiap deklarasi, atau jika Anda ingin mengubah urutan properti. Namun, jika proyek Anda menyertakan beberapa objek yang memiliki properti yang sama, dalam urutan tetap, Anda dapat mendeklarasikannya dengan lebih mudah dengan menggunakan jenis bernama dengan konstruktor kelas. Misalnya, dengan konstruktor yang sesuai, lebih mudah untuk mendeklarasikan beberapa instans Product
kelas daripada mendeklarasikan beberapa instans jenis anonim.
' Declaring instances of a named type.
Dim firstProd1 As New Product("paperclips", 1.29)
Dim secondProd1 As New Product("desklamp", 28.99)
Dim thirdProd1 As New Product("stapler", 5.09)
' Declaring instances of an anonymous type.
Dim firstProd2 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Dim secondProd2 = New With {Key .Name = "desklamp", Key .Price = 28.99}
Dim thirdProd2 = New With {Key .Name = "stapler", Key .Price = 5.09}
Keuntungan lain dari jenis yang memiliki nama adalah pengompilasi dapat menangkap kesalahan ketik pada nama properti yang terjadi secara tidak sengaja. Dalam contoh sebelumnya, firstProd2
, secondProd2
, dan thirdProd2
dimaksudkan untuk menjadi instans dengan jenis anonim yang sama. Namun, jika Anda secara tidak sengaja menyatakan thirdProd2
dengan salah satu cara berikut, jenisnya akan berbeda dari firstProd2
dan secondProd2
.
' Dim thirdProd2 = New With {Key .Name = "stapler", Key .Price = 5.09}
' Dim thirdProd2 = New With {Key .Name = "stapler", Key .Price = "5.09"}
' Dim thirdProd2 = New With {Key .Name = "stapler", .Price = 5.09}
Yang lebih penting, ada batasan pada penggunaan tipe anonim yang tidak berlaku untuk instans tipe bernama.
firstProd2
, secondProd2
, dan thirdProd2
adalah instans dari jenis anonim yang sama. Namun, nama untuk tipe anonim bersama tidak tersedia dan tidak dapat digunakan di tempat di mana nama tipe diharapkan dalam kode Anda. Misalnya, jenis anonim tidak dapat digunakan untuk menentukan tanda tangan metode, untuk mendeklarasikan variabel atau bidang lain, atau dalam deklarasi jenis apa pun. Akibatnya, jenis anonim tidak sesuai ketika Anda harus berbagi informasi di seluruh metode.
Definisi Tipe Anonim (untuk pemrograman)
Sebagai respons terhadap deklarasi instans jenis anonim, pengompilasi membuat definisi kelas baru yang berisi properti yang ditentukan.
Jika jenis anonim berisi setidaknya satu properti kunci, definisi akan mengambil alih tiga anggota yang diwariskan dari Object: Equals, GetHashCode, dan ToString. Kode yang diproduksi untuk menguji kesetaraan dan menentukan nilai kode hash hanya mempertimbangkan properti kunci. Jika jenis anonim tidak berisi properti kunci, hanya ToString ditimpa. Properti bernama eksplisit dari tipe anonim tidak dapat bertentangan dengan metode yang dihasilkan tersebut. Artinya, Anda tidak dapat menggunakan .Equals
, .GetHashCode
, atau .ToString
untuk memberi nama properti.
Definisi jenis anonim yang memiliki setidaknya satu properti kunci juga mengimplementasikan System.IEquatable<T> antarmuka, di mana T
adalah jenis jenis anonim.
Untuk informasi selengkapnya tentang kode yang dibuat oleh compiler dan fungsionalitas metode yang di-override, lihat Definisi Jenis Anonim.