Bagikan melalui


Definisi Tipe Anonim (Visual Basic)

Menanggapi deklarasi instans jenis anonim, pengkompilasi membuat definisi kelas baru yang berisi properti yang ditentukan untuk jenis tersebut.

Kode yang Dihasilkan Pengompilasi

Untuk definisi product berikut, pengkompilasi membuat definisi kelas baru yang berisi properti Name, Price, dan OnHand.

' Variable product is an instance of an anonymous type.
Dim product = New With {Key .Name = "paperclips", Key .Price = 1.29, .OnHand = 24}

Definisi kelas berisi definisi properti yang mirip dengan yang berikut ini. Perhatikan bahwa tidak ada metode Set untuk properti kunci. Nilai properti kunci bersifat baca-saja.

Public Class $Anonymous1
    Private _name As String
    Private _price As Double
    Private _onHand As Integer
     Public ReadOnly Property Name() As String
        Get
            Return _name
        End Get
    End Property

    Public ReadOnly Property Price() As Double
        Get
            Return _price
        End Get
    End Property

    Public Property OnHand() As Integer
        Get
            Return _onHand
        End Get
        Set(ByVal Value As Integer)
            _onHand = Value
        End Set
    End Property

End Class

Selain itu, definisi jenis anonim berisi konstruktor tanpa parameter. Konstruktor yang memerlukan parameter tidak diizinkan.

Jika deklarasi jenis anonim berisi setidaknya satu properti kunci, definisi jenis mengambil alih tiga anggota yang diwarisi dari Object: Equals, GetHashCode, dan ToString. Jika tidak ada properti kunci yang dideklarasikan, hanya ToString yang diambil alih. Pengambil-alihan menyediakan fungsionalitas berikut:

  • Equals mengembalikan True jika dua instans jenis anonim adalah instans yang sama, atau jika memenuhi kondisi berikut:

    • Mereka memiliki jumlah properti yang sama.

    • Properti dideklarasikan dalam urutan yang sama, dengan nama yang sama dan jenis disimpulkan yang sama. Perbandingan nama tidak peka huruf besar/kecil.

    • Setidaknya salah satu properti adalah properti kunci, dan kata kunci Key diterapkan ke properti yang sama.

    • Perbandingan setiap pasangan properti kunci yang sesuai mengembalikan True.

      Misalnya, dalam contoh berikut, Equals mengembalikan True hanya untuk employee01 dan employee08. Komentar sebelum setiap baris menentukan alasan mengapa instans baru tidak cocok dengan employee01.

      Dim employee01 = New With {Key .Name = "Bob", Key .Category = 3, .InOffice = False}
      
      ' employee02 has no InOffice property.
      Dim employee02 = New With {Key .Name = "Bob", Key .Category = 3}
      
      ' The first property has a different name.
      Dim employee03 = New With {Key .FirstName = "Bob", Key .Category = 3, .InOffice = False}
      
      ' Property Category has a different value.
      Dim employee04 = New With {Key .Name = "Bob", Key .Category = 2, .InOffice = False}
      
      ' Property Category has a different type.
      Dim employee05 = New With {Key .Name = "Bob", Key .Category = 3.2, .InOffice = False}
      
      ' The properties are declared in a different order.
      Dim employee06 = New With {Key .Category = 3, Key .Name = "Bob", .InOffice = False}
      
      ' Property Category is not a key property.
      Dim employee07 = New With {Key .Name = "Bob", .Category = 3, .InOffice = False}
      
      ' employee01 and employee 08 meet all conditions for equality. Note 
      ' that the values of the non-key field need not be the same.
      Dim employee08 = New With {Key .Name = "Bob", Key .Category = 2 + 1, .InOffice = True}
      
      ' Equals returns True only for employee01 and employee08.
      Console.WriteLine(employee01.Equals(employee08))
      
  • GetHashcode menyediakan algoritma GetHashCode yang unik dengan tepat. Algoritma hanya menggunakan properti kunci untuk menghitung kode hash.

  • ToString mengembalikan string nilai properti yang digabungkan, seperti yang ditunjukkan dalam contoh berikut. Properti kunci dan non-kunci disertakan.

    Console.WriteLine(employee01.ToString())
    Console.WriteLine(employee01)
    ' The preceding statements both display the following:
    ' { Name = Bob, Category = 3, InOffice = False }
    

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.

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

Catatan

Deklarasi jenis anonim membuat jenis anonim yang sama hanya jika terjadi dalam rakitan yang sama, propertinya memiliki nama yang sama dan jenis yang disimpulkan yang sama, properti dideklarasikan dalam urutan yang sama, dan properti yang sama ditandai sebagai properti kunci.

Lihat juga