Udostępnij za pośrednictwem


Definicja typu anonimowego (Visual Basic)

W odpowiedzi na zgłoszenia wystąpienie typ anonimowy, kompilator utworzy nową definicję klasy, zawierający właściwości określonego typu.

Kod generowany przez kompilator

Dla następujących definicji product, kompilator utworzy nową definicję klasy, która zawiera właściwości Name, Price, i OnHand.

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

Definicja klasy zawiera definicje właściwość , które są podobne do następujących.Należy zauważyć, że nie ma żadnych Set metoda dla właściwości klucza. Wartości właściwości klucza są tylko do odczytu.

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

Ponadto definicje typ anonimowy zawierają domyślnego konstruktor.Konstruktory, które są wymagane parametry nie są dozwolone.

Jeśli deklaracja typ anonimowy zawiera co najmniej jednego klucza właściwość, definicja typu zastępuje trzech członków dziedziczonych od Object: Equals, GetHashCode, i ToString.Jeśli nie właściwości klucza są zadeklarowane, tylko ToString jest zastąpiona.Przesłonięcia zapewniają następujące funkcje:

  • EqualsZwraca True dwa wystąpienia typu anonimowe są tego samego wystąpienia lub spełniają następujące warunki:

    • Mają taką samą liczbę właściwości.

    • Właściwości są zadeklarowane w tej samej kolejności, z tych samych nazw i takie same kojarzyć typy.Nazwa porównania nie jest rozróżniana.

    • Jest co najmniej jedna z właściwości klucza właściwośći Key słowo kluczowe jest zastosowane do tych samych właściwości.

    • Zwraca porównanie każdej pary odpowiednie właściwości klucza True.

    Na przykład w poniższych przykładach Equals zwraca True tylko dla employee01 i employee08.Komentarz przed każdego wiersza określa przyczyny, dlaczego nie pasuje nowe wystąpienie 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))
    
  • GetHashcodezapewnia odpowiednio unikatowy GetHashCode algorytm.algorytm używa właściwości klucza do wyliczenia wartość skrótu.

  • ToStringZwraca ciąg wartości uzyskiwanej właściwość , jak pokazano w poniższym przykładzie.Zarówno klucz, jak i właściwości klucza nie są uwzględniane.

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

Wyraźnie nazwane właściwości Typ anonimowy nie może powodować konfliktu z tych metod wygenerowany.Oznacza to, że nie można użyć .Equals, .GetHashCode, lub .ToString do nazwy właściwość.

Definicje typ anonimowy, które obejmują przynajmniej jedną właściwość klucza również wdrożenie IEquatable interfejs, gdzie T jest typem Typ anonimowy.

[!UWAGA]

Typ anonimowy deklaracje utworzyć ten sam typ anonimowy tylko wtedy, gdy występują one w tym samym zestaw, ich właściwości tych samych nazwach i takie same kojarzyć typy, właściwości są zadeklarowane w tej samej kolejności i tych samych właściwości są oznaczone jako właściwości klucza.

Zobacz też

Zadania

Porady: wnioskowanie nazw właściwości i typów w deklaracjach typu anonimowego (Visual Basic)

Koncepcje

Typy anonimowe (Visual Basic)