Cara: Menyimpulkan Nama dan Jenis Properti dalam Deklarasi Jenis Anonim (Visual Basic)
Jenis anonim tidak menyediakan mekanisme untuk menentukan jenis data properti secara langsung. Jenis semua properti disimpulkan. Dalam contoh berikut, jenis Name
dan Price
disimpulkan langsung dari nilai yang digunakan untuk menginisialisasinya.
' Variable product is an instance of a simple anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}
Jenis anonim juga dapat menyimpulkan nama dan jenis properti dari sumber lain. Bagian berikut memberikan daftar keadaan di mana inferensi dimungkinkan, dan contoh situasi di mana hal tersebut tidak dilakukan.
Inferensi Berhasil
Jenis anonim dapat menyimpulkan nama dan jenis properti dari sumber berikut:
Dari nama variabel. Jenis anonim
anonProduct
akan memiliki dua properti,productName
danproductPrice
. Masing-masing jenis data akan memiliki variabel asliString
danDouble
.Dim productName As String = "paperclips" Dim productPrice As Double = 1.29 Dim anonProduct = New With {Key productName, Key productPrice} ' To create uppercase variable names for the new properties, ' assign variables productName and productPrice to uppercase identifiers. Dim anonProduct1 = New With {Key .Name = productName, Key .Price = productPrice}
Dari properti atau nama bidang objek lain. Sebagai contoh, pertimbangkan objek
car
jenisCarClass
yang menyertakan propertiName
danID
. Untuk membuat instans jenis anonim baru, properticar1
, denganName
danID
yang diinsialisasi dengan nilai dari objekcar
, Anda dapat menulis yang berikut:Dim car1 = New With {Key car.Name, Key car.ID}
Deklarasi sebelumnya setara dengan baris kode yang lebih panjang yang mendefinisikan jenis
car2
anonim.Dim car2 = New With {Key .Name = car.Name, Key .ID = car.ID}
Dari nama anggota XML.
Dim books = <Books> <Book Author="Jesper Aaberg"> Advanced Programming Methods </Book> </Books> Dim anon = New With {books...<Book>}
Jenis yang dihasilkan untuk
anon
akan memiliki satu properti,Book
, dari jenis IEnumerable(Dari XElement).Dari fungsi yang tidak memiliki parameter, seperti
SomeFunction
dalam contoh berikut.Dim sc As New SomeClass Dim anon1 = New With {Key sc.SomeFunction()}
Variabel
anon2
dalam kode berikut adalah jenis anonim yang memiliki satu properti, karakter bernamaFirst
. Kode ini akan menampilkan huruf "E," huruf yang dikembalikan oleh fungsi First.Dim aString As String = "Example String" Dim anon2 = New With {Key aString.First()} ' The variable anon2 has one property, First. Console.WriteLine(anon2.First)
Kegagalan Inferensi
Inferensi nama akan gagal dalam banyak keadaan, termasuk yang berikut ini:
Inferensi berasal dari pemanggilan metode, konstruktor, atau properti berparameter yang memerlukan argumen. Deklarasi
anon1
sebelumnya gagal jikasomeFunction
memiliki satu atau beberapa argumen.' Not valid. ' Dim anon3 = New With {Key sc.someFunction(someArg)}
Penugasan ke nama properti baru memecahkan masalah.
' Valid. Dim anon4 = New With {Key .FunResult = sc.someFunction(someArg)}
Inferensi berasal dari ekspresi kompleks.
Dim aString As String = "Act " ' Not valid. ' Dim label = New With {Key aString & "IV"}
Kesalahan dapat diatasi dengan menetapkan hasil ekspresi ke nama properti.
' Valid. Dim label1 = New With {Key .someLabel = aString & "IV"}
Inferensi untuk beberapa properti menghasilkan dua properti atau lebih yang memiliki nama yang sama. Merujuk kembali ke deklarasi dalam contoh sebelumnya, Anda tidak dapat mencantumkan
product.Name
dancar1.Name
sebagai properti dengan jenis anonim yang sama. Ini karena pengidentifikasi yang disimpulkan untuk masing-masing ini adalahName
.' Not valid. ' Dim anon5 = New With {Key product.Name, Key car1.Name}
Masalah dapat diselesaikan dengan menetapkan nilai ke nama properti yang berbeda.
' Valid. Dim anon6 = New With {Key .ProductName = product.Name, Key .CarName = car1.Name}
Perhatikan bahwa perubahan kasus (perubahan antara huruf besar dan huruf kecil) tidak membuat dua nama berbeda.
Dim price = 0 ' Not valid, because Price and price are the same name. ' Dim anon7 = New With {Key product.Price, Key price}
Jenis awal dan nilai satu properti tergantung pada properti lain yang belum ditetapkan. Misalnya,
.IDName = .LastName
tidak valid dalam deklarasi jenis anonim kecuali.LastName
sudah diinisialisasi.' Not valid. ' Dim anon8 = New With {Key .IDName = .LastName, Key .LastName = "Jones"}
Dalam contoh ini, Anda dapat memperbaiki masalah dengan mengembalikan urutan di mana properti dideklarasikan.
' Valid. Dim anon9 = New With {Key .LastName = "Jones", Key .IDName = .LastName}
Nama properti dari jenis anonim sama dengan nama anggota Object. Misalnya, deklarasi berikut gagal karena
Equals
merupakan metode dari Object.' Not valid. ' Dim relationsLabels1 = New With {Key .Equals = "equals", Key .Greater = _ ' "greater than", Key .Less = "less than"}
Anda dapat memperbaiki masalah dengan mengubah nama properti:
' Valid Dim relationsLabels2 = New With {Key .EqualString = "equals", Key .GreaterString = "greater than", Key .LessString = "less than"}
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk