Sdílet prostřednictvím


Definice autonomního typu (Visual Basic)

V reakci na deklaraci instance anonymního typu kompilátor vytvoří novou definici třídy, která obsahuje zadané vlastnosti pro daný typ.

Kód vygenerovaný kompilátorem

Pro následující definici productkompilátor vytvoří novou definici třídy, která obsahuje vlastnosti Name, Pricea OnHand.

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

Definice třídy obsahuje definice vlastností podobné následujícímu. Všimněte si, že pro vlastnosti klíče neexistuje žádná Set metoda. Hodnoty vlastností klíče jsou jen pro čtení.

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

Kromě toho definice anonymního typu obsahují konstruktor bez parametrů. Konstruktory, které vyžadují parametry, nejsou povoleny.

Pokud deklarace anonymního typu obsahuje alespoň jednu vlastnost klíče, definice typu přepíše tři členy zděděné z Object: Equals, GetHashCodea ToString. Pokud nejsou deklarovány žádné vlastnosti klíče, přepíše se pouze ToString . Přepsání poskytují následující funkce:

  • Equals vrátí True , pokud jsou dvě instance anonymního typu stejné instance nebo pokud splňují následující podmínky:

    • Mají stejný počet vlastností.

    • Vlastnosti jsou deklarovány ve stejném pořadí se stejnými názvy a stejnými odvozenými typy. Porovnání názvů nerozlišují malá a velká písmena.

    • Nejméně jedna z vlastností je klíčovou vlastností a Key klíčové slovo se použije na stejné vlastnosti.

    • Porovnání každého odpovídajícího páru vlastností klíče vrátí True.

      Například v následujících příkladech Equals vrátí True pouze pro employee01 a employee08. Komentář před každým řádkem určuje důvod, proč se nová instance neshoduje 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 poskytuje správně jedinečný algoritmus GetHashCode. Algoritmus k výpočtu kódu hash používá pouze klíčové vlastnosti.

  • ToString vrátí řetězec zřetězených hodnot vlastností, jak je znázorněno v následujícím příkladu. Jsou zahrnuty vlastnosti klíče i jiného klíče.

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

Explicitně pojmenované vlastnosti anonymního typu nemohou být v konfliktu s těmito vygenerovanými metodami. To znamená, že nelze použít .Equals, .GetHashCodeani .ToString pojmenovat vlastnost.

Definice anonymního typu, které obsahují alespoň jednu vlastnost klíče, také implementují System.IEquatable<T> rozhraní, kde T je typ anonymního typu.

Poznámka:

Deklarace anonymního typu vytvářejí stejný anonymní typ pouze v případě, že dojde ve stejném sestavení, jejich vlastnosti mají stejné názvy a stejné odvozené typy, vlastnosti jsou deklarovány ve stejném pořadí a stejné vlastnosti jsou označené jako klíčové vlastnosti.

Viz také