Bagikan melalui


Tipe Anonim (Visual Basic)

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, karena cust.Name merupakan string.

    Dim custs1 = From cust In customers
                 Select cust.Name
    
  • custs2 berisi kumpulan Customer objek, karena setiap elemen customers adalah Customer 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.

Lihat juga