Bagikan melalui


Jenis Anonim (Visual Basic)

Visual Basic mendukung jenis anonim, yang memungkinkan Anda membuat objek tanpa menulis penentuan kelas untuk jenis data tersebut. Sebaliknya, 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 jenis 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 penyimpan 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 penyimpan 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 adalah pengompilasi yang dihasilkan dan dapat bervariasi dari kompilasi ke kompilasi. Kode Anda tidak boleh menggunakan atau mengandalkan nama jenis anonim karena nama mungkin berubah saat proyek dikompilasi ulang.

Mendeklarasikan Jenis Anonim

Deklarasi instans jenis anonim menggunakan daftar penginisialisasi 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 menetapkan 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.

Properti Utama

Properti utama berbeda dari properti non-kunci dalam beberapa hal 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 pengompilasi untuk jenis anonim.

Persamaan

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 dideklarasikan dalam perakitan yang sama.

  • Properti mereka memiliki nama yang sama, jenis yang disimpulkan sama, dan dinyatakan dalam urutan yang sama. Perbandingan nama tidak peka 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 instans itu 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 bersifat 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 Baca-saja

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

Jenis Anonim dari Ekspresi Kueri

Ekspresi kueri tidak selalu memerlukan pembuatan jenis anonim. Jika memungkinkan, mereka menggunakan jenis yang 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 bisa 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 objek Customer, dan seluruh elemen dipilih oleh kueri.

    Dim custs2 = From cust In customers
                 Select cust
    

Namun, jenis bernama yang sesuai tidak selalu tersedia. Anda mungkin ingin memilih nama dan alamat pelanggan untuk satu tujuan, nomor ID pelanggan dan lokasi untuk tujuan lain, dan nama pelanggan, alamat, dan riwayat pesanan untuk tujuan 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, pengompilasi membuat jenis anonim untuk setiap kompilasi properti. Kueri berikut ini hanya memilih nama pelanggan dan nomor ID dari setiap objek Customer 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 jenis 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 berjenis kuat, dan Anda dapat menggunakan IntelliSense untuk menavigasi melalui properti yang tersedia dan untuk memverifikasi jenisnya.

Untuk informasi selengkapnya, lihat Pengantar 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 dimiliki kelas lengkap, jenis anonim adalah solusi yang baik. Jenis anonim juga mudah 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 kelas Product 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 bernama adalah pengompilasi dapat menangkap kesalahan ketik nama properti yang tidak disengaja. Dalam contoh sebelumnya, firstProd2, secondProd2, dan thirdProd2 dimaksudkan untuk menjadi instans dengan jenis anonim yang sama. Namun, jika Anda secara tidak sengaja mendeklarasikan thirdProd2 dengan salah satu cara berikut, jenisnya akan berbeda dari jenis 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}

Lebih penting lagi, ada batasan penggunaan jenis anonim yang tidak berlaku untuk instans jenis bernama. firstProd2, secondProd2, dan thirdProd2 adalah instans dengan jenis anonim yang sama. Namun, nama untuk jenis anonim bersama tidak tersedia dan tidak dapat muncul di mana nama jenis 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.

Penentuan Jenis Anonim

Menanggapi deklarasi instans jenis anonim, pengkompilasi membuat penentuan kelas baru yang berisi properti yang ditentukan.

Jika jenis anonim berisi setidaknya satu properti kunci, penentuan trersebut mengambil alih tiga anggota yang diwarisi dari Object: Equals, GetHashCode, dan ToString. Kode yang dihasilkan untuk menguji kesetaraan dan menentukan nilai kode hash hanya mempertimbangkan properti utama. Jika jenis anonim tidak berisi properti kunci, hanya ToString yang diambil alih. Properti bernama eksplisit dari jenis anonim tidak dapat bertentangan dengan metode yang dihasilkan ini. Artinya, Anda tidak dapat menggunakan .Equals, .GetHashCode, atau .ToString untuk memberi nama properti.

Penentuan jenis anonim yang memiliki setidaknya satu properti kunci juga mengimplementasikan antarmuka System.IEquatable<T>, di mana T adalah jenis anonim.

Untuk informasi selengkapnya tentang kode yang dibuat oleh pengompilasi dan fungsionalitas metode yang diambil alih, lihat Penentuan Jenis Anonim.

Lihat juga