Bagikan melalui


Penginisialisasi Objek: Jenis Bernama dan Anonim (Visual Basic)

Penginisialisasi objek memungkinkan Anda menentukan properti untuk objek kompleks dengan menggunakan satu ekspresi. Ia 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 yang mudah untuk menyatakan 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, instansiasi jenis anonim tidak dapat menyertakan nama kelas.

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

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

Jenis Bernama

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

Setiap inisialisasi dalam daftar penginisialisasi terdiri dari penugasan nilai awal ke anggota kelas. Nama dan jenis data anggota ditentukan saat kelas ditentukan. Dalam contoh berikut, kelas Customer 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 objek Customer dengan menggunakan konstruktor tanpa parameter, lalu menentukan nilai awal untuk properti Name dan City dengan menggunakan pernyataan With.

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

Jika kelas Customer berisi konstruktor berparameter yang memungkinkan Anda mengirimkan nilai untuk Name, misalnya, Anda juga dapat menyatakan dan menginisialisasi objek Customer 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"}

Akan tetapi, daftar inisialisasi tidak boleh kosong. Properti yang tidak diinisialisasi mempertahankan nilai defaultnya.

Inferensi Jenis dengan Jenis Bernama

Anda dapat menyingkat kode untuk deklarasi cust1 dengan menggabungkan penginisialisasi objek dan inferensi jenis lokal. Ini memungkinkan Anda untuk menghilangkan klausul As dalam deklarasi variabel. Jenis data variabel disimpulkan dari jenis objek yang dibuat oleh penugasan. Dalam contoh berikut, jenis dari 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 konstruktor yang sesuai dipanggil. Setelah itu, bidang individual dalam daftar penginisialisasi 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 menyatakan 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 bersarang. 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 sedang diinisialisasi tidak boleh Objek jenis.

  • Anggota kelas yang sedang diinisialisasi tidak boleh berupa anggota bersama, anggota baca-saja, konstanta, atau panggilan metode.

  • Anggota kelas yang sedang diinisialisasi tidak dapat diindeks atau disyaratkan. Contoh berikut memunculkan kesalahan pengompilasi:

    '' 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 jenis baru yang tidak Anda tentukan dan beri nama secara tersurat. Sebaliknya, pengompilasi menghasilkan jenis sesuai dengan properti yang Anda tentukan 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 sintaksis adalah bahwa tidak ada nama yang ditentukan setelah New untuk jenis data. Akan tetapi, kejadiannya cukup berbeda. Pengompilasi menentukan jenis anonim baru yang memiliki dua properti, Name dan City, dan membuat instans dengan nilai yang ditentukan. Inferensi jenis menentukan jenis Name dan City dalam contoh menjadi string.

Perhatian

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

Karena nama jenis tidak tersedia, Anda tidak dapat menggunakan klausul As untuk menyatakan cust13. Jenisnya harus disimpulkan. Tanpa penggunaan pengikatan terakhir, hal ini membatasi penggunaan jenis anonim ke 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 dalam Visual Basic.

Keterangan Tentang Jenis Anonim

  • Biasanya, semua atau sebagian besar properti dalam deklarasi jenis anonim akan berupa 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 kunci, lihat Kunci.

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

    Dim anonymousCust = New With {.Name = "Hugo Garcia"}
    
  • Ketika instans jenis anonim dinyatakan, pengompilasi menghasilkan definisi jenis anonim yang cocok. Nama dan jenis data properti diambil dari deklarasi instans, dan disertakan oleh pengompilasi dalam definisi. Properti tidak diberi nama dan ditentukan terlebih dahulu, karena akan ditujukan untuk jenis bernama. Jenisnya disimpulkan. Anda tidak dapat menentukan jenis data properti dengan menggunakan klausul As.

  • Jenis anonim juga dapat menetapkan nama dan nilai propertinya dengan beberapa cara lain. Misalnya, properti jenis anonim dapat mengambil nama maupun 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 penentuan properti dalam jenis anonim, lihat Cara: Menyimpulkan Nama dan Jenis Properti dalam Deklarasi Jenis Anonim.

Lihat juga