Anonim Tür Tanımı (Visual Basic)

Anonim bir türün örneğinin bildirimine yanıt olarak, derleyici türü için belirtilen özellikleri içeren yeni bir sınıf tanımı oluşturur.

Derleyici Tarafından Oluşturulan Kod

Aşağıdaki tanımı içinproduct, derleyici , Priceve OnHandözelliklerini Nameiçeren yeni bir sınıf tanımı oluşturur.

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

Sınıf tanımı aşağıdakine benzer özellik tanımları içerir. Anahtar özellikleri için bir yöntem olmadığına Set dikkat edin. Anahtar özelliklerin değerleri salt okunur olur.

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

Ayrıca, anonim tür tanımları parametresiz bir oluşturucu içerir. Parametre gerektiren oluşturuculara izin verilmez.

Anonim tür bildirimi en az bir anahtar özelliği içeriyorsa, tür tanımı : , GetHashCodeve ToStringöğesinden devralınan üç üyeyi EqualsObjectgeçersiz kılar. Hiçbir anahtar özellik bildirilmemişse, yalnızca ToString geçersiz kılınmış olur. Geçersiz kılmalar aşağıdaki işlevleri sağlar:

  • Equals , iki anonim tür örneğin aynı örnek olup olmadığını veya aşağıdaki koşulları karşılıyorsa döndürür True :

    • Aynı sayıda özelliğe sahiptirler.

    • Özellikler, aynı adlarla ve aynı çıkarım türleriyle aynı sırada bildirilir. Ad karşılaştırmaları büyük/küçük harfe duyarlı değildir.

    • Özelliklerden en az biri anahtar özelliktir ve Key anahtar sözcüğü aynı özelliklere uygulanır.

    • İlgili her anahtar özellik çiftinin karşılaştırması döndürür True.

      Örneğin, aşağıdaki örneklerde Equals yalnızca ve employee08için employee01 döndürürTrue. Her satırdan önceki açıklama, yeni örneğin eşleşmeme employee01nedenini belirtir.

      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 uygun şekilde benzersiz bir GetHashCode algoritması sağlar. Algoritma, karma kodu hesaplamak için yalnızca anahtar özelliklerini kullanır.

  • ToString aşağıdaki örnekte gösterildiği gibi birleştirilmiş özellik değerleri dizesi döndürür. Hem anahtar hem de anahtar olmayan özellikler dahil edilir.

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

Anonim bir türün açıkça adlandırılmış özellikleri, oluşturulan bu yöntemlerle çakışamaz. Yani, bir özelliği adlandırmak için , .GetHashCodeveya .ToString kullanamazsınız.Equals.

En az bir anahtar özelliği içeren anonim tür tanımları da arabirimini uygular System.IEquatable<T> ; burada T anonim türün türüdür.

Not

Anonim tür bildirimleri yalnızca aynı derlemede oluşurlarsa, özellikleri aynı adlara ve aynı çıkarım türlerine sahipse, özellikler aynı sırada bildirilir ve aynı özellikler anahtar özellikleri olarak işaretlenirse aynı anonim türü oluşturur.

Ayrıca bkz.