Udostępnij za pośrednictwem


Definicja typu anonimowego (Visual Basic)

W odpowiedzi na deklarację wystąpienia typu anonimowego kompilator tworzy nową definicję klasy, która zawiera określone właściwości dla typu.

Kod wygenerowany przez kompilator

W przypadku poniższej productdefinicji kompilator tworzy nową definicję klasy zawierającą właściwości Name, Pricei 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ści podobne do poniższych. Zwróć uwagę, że nie ma Set metody 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 anonimowe definicje typów zawierają konstruktor bez parametrów. Konstruktory, które wymagają parametrów, nie są dozwolone.

Jeśli deklaracja typu anonimowego zawiera co najmniej jedną właściwość klucza, definicja typu zastępuje trzy elementy członkowskie dziedziczone z Object: Equals, GetHashCodei ToString. Jeśli nie zadeklarowane są żadne właściwości klucza, tylko ToString zostanie zastąpiona. Przesłonięcia zapewniają następujące funkcje:

  • Equals Zwraca True wartość , jeśli dwa wystąpienia typu anonimowego są tym samym wystąpieniem lub jeśli spełniają następujące warunki:

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

    • Właściwości są deklarowane w tej samej kolejności, z tymi samymi nazwami i tymi samymi typami wnioskowanymi. Porównania nazw nie są uwzględniane wielkości liter.

    • Co najmniej jedna z właściwości jest właściwością klucza, a Key słowo kluczowe jest stosowane do tych samych właściwości.

    • Porównanie każdej odpowiadającej pary właściwości klucza zwraca wartość True.

      Na przykład w poniższych przykładach Equals zwracane są True tylko wartości i employee01employee08. Komentarz przed każdym wierszem określa przyczynę, dla którego nowe wystąpienie nie jest zgodne 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 zapewnia odpowiednio unikatowy algorytm GetHashCode. Algorytm używa tylko właściwości klucza do obliczenia kodu skrótu.

  • ToString Zwraca ciąg połączonych wartości właściwości, jak pokazano w poniższym przykładzie. Uwzględniane są zarówno właściwości klucza, jak i innego niż klucz.

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

Jawnie nazwane właściwości typu anonimowego nie mogą powodować konfliktu z tymi wygenerowanymi metodami. Oznacza to, że nie można nazwać właściwości za pomocą .Equalsmetody , .GetHashCodeani .ToString .

Definicje typów anonimowych, które zawierają co najmniej jedną właściwość klucza, implementują System.IEquatable<T> również interfejs, gdzie T jest typem typu anonimowego.

Uwaga

Deklaracje typów anonimowych tworzą ten sam typ anonimowy tylko wtedy, gdy wystąpią w tym samym zestawie, ich właściwości mają takie same nazwy i te same typy wnioskowane, właściwości są deklarowane w tej samej kolejności, a te same właściwości są oznaczone jako właściwości klucza.

Zobacz też