Bagikan melalui


Penginisialisasi Objek: Tipe Bernama dan Anonim (Visual Basic)

Penginisialisasi objek memungkinkan Anda menentukan properti untuk objek kompleks dengan menggunakan ekspresi tunggal. Mereka dapat digunakan untuk membuat instans jenis bernama dan jenis anonim.

Deklarasi

Deklarasi instans jenis bernama dan anonim dapat terlihat hampir identik, tetapi efeknya tidak sama. Setiap kategori memiliki kemampuan dan batasan sendiri. Contoh berikut menunjukkan cara mudah untuk mendeklarasikan dan menginisialisasi instans kelas bernama, Customer, dengan menggunakan daftar penginisialisasi objek. Perhatikan bahwa nama kelas ditentukan setelah kata kunci New.

Dim namedCust = New Customer With {.Name = "Terry Adams"}

Jenis anonim tidak memiliki nama yang dapat digunakan. Oleh karena itu, instans jenis anonim tidak dapat menyertakan nama kelas.

Dim anonymousCust = New With {.Name = "Hugo Garcia"}

Persyaratan dan hasil dari dua deklarasi tidak sama. Untuk namedCust, kelas Customer yang memiliki properti Name harus sudah ada, dan deklarasi tersebut membuat sebuah instans dari kelas itu. Untuk anonymousCust, pengkompilasi mendefinisikan kelas baru yang memiliki satu properti, string yang disebut Name, dan membuat instans baru kelas tersebut.

Jenis yang Diberi Nama

Penginisialisasi objek menyediakan cara sederhana untuk memanggil konstruktor jenis lalu mengatur nilai beberapa atau semua properti dalam satu pernyataan. Kompilator memanggil konstruktor yang sesuai untuk pernyataan: konstruktor tanpa parameter jika tidak ada argumen yang disajikan, atau konstruktor berparameter jika satu atau beberapa argumen dikirim. Setelah itu, properti yang ditentukan diinisialisasi dalam urutan disajikan dalam daftar penginisialisasi.

Setiap inisialisasi dalam daftar penginisialisasi terdiri dari penetapan nilai awal kepada anggota kelas. Nama dan jenis data anggota ditentukan saat kelas ditentukan. Dalam contoh berikut, Customer kelas harus ada, dan harus memiliki anggota bernama Name dan City yang dapat menerima nilai string.

Dim cust0 As Customer = New Customer With {.Name = "Toni Poe", 
                                           .City = "Louisville"}

Atau, Anda dapat memperoleh hasil yang sama dengan menggunakan kode berikut:

Dim cust1 As New Customer With {.Name = "Toni Poe", 
                                .City = "Louisville"}

Masing-masing deklarasi ini setara dengan contoh berikut, yang membuat Customer objek dengan menggunakan konstruktor tanpa parameter, lalu menentukan nilai awal untuk Name properti dan City dengan menggunakan With pernyataan.

Dim cust2 As New Customer()
With cust2
    .Name = "Toni Poe"
    .City = "Louisville"
End With

Customer Jika kelas berisi konstruktor berparameter yang memungkinkan Anda mengirim nilai untuk Name, misalnya, Anda juga dapat mendeklarasikan dan menginisialisasi Customer objek dengan cara berikut:

Dim cust3 As Customer = 
    New Customer("Toni Poe") With {.City = "Louisville"}
' --or--
Dim cust4 As New Customer("Toni Poe") With {.City = "Louisville"}

Anda tidak perlu menginisialisasi semua properti, seperti yang ditunjukkan kode berikut.

Dim cust5 As Customer = New Customer With {.Name = "Toni Poe"}

Namun, daftar inisialisasi tidak boleh kosong. Properti yang tidak diinisialisasi mempertahankan nilai default mereka.

Inferensi Tipe dengan Jenis Bernama

Anda dapat mempersingkat kode untuk deklarasi cust1 dengan menggabungkan penginisialisasi objek dan inferensi jenis lokal. Ini memungkinkan Anda untuk menghilangkan As klausul dalam deklarasi variabel. Jenis data variabel disimpulkan dari jenis objek yang dibuat oleh penugasan. Dalam contoh berikut, jenisnya cust6 adalah Customer.

Dim cust6 = New Customer With {.Name = "Toni Poe", 
                               .City = "Louisville"}

Keterangan Tentang Jenis Bernama

  • Anggota kelas tidak dapat diinisialisasi lebih dari satu kali dalam daftar penginisialisasi objek. Deklarasi cust7 menyebabkan kesalahan.

    '' This code does not compile because Name is initialized twice.
    ' Dim cust7 = New Customer With {.Name = "Toni Poe", 
    '                                .City = "Louisville",
    '                                .Name = "Blue Yonder Airlines"}
    
  • Anggota dapat digunakan untuk menginisialisasi dirinya sendiri atau bidang lain. Jika anggota diakses sebelum diinisialisasi, seperti dalam deklarasi berikut untuk cust8, nilai default akan digunakan. Ingatlah bahwa ketika deklarasi yang menggunakan penginisialisasi objek diproses, hal pertama yang terjadi adalah bahwa konstruktor yang sesuai dipanggil. Setelah itu, bidang individual dalam daftar inisialisasi diinisialisasi. Dalam contoh berikut, nilai default untuk Name ditetapkan untuk cust8, dan nilai yang diinisialisasi ditetapkan dalam cust9.

    Dim cust8 = New Customer With {.Name = .Name & ", President"}
    Dim cust9 = New Customer With {.Name = "Toni Poe", 
                                   .Title = .Name & ", President"}
    

    Contoh berikut menggunakan konstruktor berparameter dari cust3 dan cust4 untuk mendeklarasikan dan menginisialisasi cust10 dan cust11.

    Dim cust10 = New Customer("Toni Poe") With {.Name = .Name & ", President"}
    ' --or--
    Dim cust11 As New Customer("Toni Poe") With {.Name = .Name & ", President"}
    
  • Penginisialisasi objek dapat ditumpuk. Dalam contoh berikut, AddressClass adalah kelas yang memiliki dua properti, City dan State, dan kelas Customer memiliki properti Address yang merupakan instans dari AddressClass.

    Dim cust12 = 
        New Customer With {.Name = "Toni Poe", 
                           .Address = 
                               New AddressClass With {.City = "Louisville", 
                                                      .State = "Kentucky"}}
    Console.WriteLine(cust12.Address.State)
    
  • Daftar inisialisasi tidak boleh kosong.

  • Instans yang diinisialisasi tidak boleh berjenis Objek.

  • Anggota kelas yang diinisialisasi tidak dapat menjadi anggota bersama, anggota baca-saja, konstanta, atau panggilan metode.

  • Anggota kelas yang sedang diinisialisasi tidak dapat diindeks atau di-spesifikasikan. Contoh berikut meningkatkan kesalahan kompilator:

    '' Not valid.

    ' Dim c1 = New Customer With {.OrderNumbers(0) = 148662}

    ' Dim c2 = New Customer with {.Address.City = "Springfield"}

Jenis Anonim

Jenis anonim menggunakan penginisialisasi objek untuk membuat instans dari jenis baru yang tidak Anda definisikan dan beri nama secara eksplisit. Sebagai gantinya, pengkompilasi menghasilkan jenis sesuai dengan properti yang Anda tetapkan dalam daftar penginisialisasi objek. Karena nama jenis tidak ditentukan, nama tersebut disebut sebagai jenis anonim. Misalnya, bandingkan deklarasi berikut dengan yang sebelumnya untuk cust6.

Dim cust13 = New With {.Name = "Toni Poe", 
                       .City = "Louisville"}

Satu-satunya perbedaan secara sintis adalah bahwa tidak ada nama yang ditentukan setelah New untuk jenis data. Namun, apa yang terjadi cukup berbeda. Pengompilasi mendefinisikan jenis anonim baru yang memiliki dua properti, Name dan City, dan membuat instansnya dengan nilai yang ditentukan. Inferensi jenis menentukan jenis Name dan City dalam contoh menjadi string.

Perhatian

Nama tipe anonim dihasilkan oleh pengompilasi, dan dapat bervariasi dari kompilasi hingga kompilasi. Kode Anda tidak boleh menggunakan atau mengandalkan nama jenis anonim.

Karena nama jenis tidak tersedia, Anda tidak dapat menggunakan As klausul untuk mendeklarasikan cust13. Jenisnya harus disimpulkan. Tanpa menggunakan late binding, hal ini membatasi penggunaan jenis anonim hanya pada variabel lokal.

Jenis anonim memberikan dukungan penting untuk kueri LINQ. Untuk informasi selengkapnya tentang penggunaan jenis anonim dalam kueri, lihat Jenis Anonim dan Pengenalan LINQ di Visual Basic.

Keterangan Tentang Jenis Anonim

  • Biasanya, semua atau sebagian besar properti dalam deklarasi jenis anonim akan menjadi properti kunci, yang ditunjukkan dengan mengetik kata kunci Key di depan nama properti.

    
    Dim anonymousCust1 = New With {Key .Name = "Hugo Garcia", 
                                   Key .City = "Louisville"}
    

    Untuk informasi selengkapnya tentang properti utama, lihat Kunci.

  • Seperti jenis bernama, daftar penginisialisasi untuk definisi jenis anonim harus mendeklarasikan setidaknya satu properti.

    Dim anonymousCust = New With {.Name = "Hugo Garcia"}
    
  • Ketika instans jenis anonim dideklarasikan, kompilator menghasilkan definisi jenis anonim yang cocok. Nama dan jenis data properti diambil dari deklarasi instans, dan disertakan oleh pengkompilasi dalam definisi. Properti tidak dinamai dan didefinisikan terlebih dahulu, seperti halnya untuk tipe yang sudah diberi nama. Jenis mereka disimpulkan. Anda tidak dapat menentukan tipe data properti dengan menggunakan klausa As .

  • Jenis anonim juga dapat menetapkan nama dan nilai propertinya dengan beberapa cara lain. Misalnya, properti jenis anonim dapat mengambil nama dan nilai variabel, atau nama dan nilai properti objek lain.

    ' Create a variable, Name, and give it an initial value.
    Dim Name = "Hugo Garcia"
    
    ' Variable anonymousCust2 will have one property, Name, with 
    ' "Hugo Garcia" as its initial value.
    Dim anonymousCust2 = New With {Key Name}
    
    ' The next declaration uses a property from namedCust, defined
    ' in an earlier example. After the declaration, anonymousCust3 will
    ' have one property, Name, with "Terry Adams" as its value.
    Dim anonymousCust3 = New With {Key namedCust.Name}
    

    Untuk informasi selengkapnya tentang opsi untuk menentukan properti dalam jenis anonim, lihat Cara: Menyimpulkan Nama dan Jenis Properti dalam Deklarasi Tipe Anonim.

Lihat juga