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 product
kompilátor vytvoří novou definici třídy, která obsahuje vlastnosti Name
, Price
a 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 proemployee01
aemployee08
. Komentář před každým řádkem určuje důvod, proč se nová instance neshodujeemployee01
.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
, .GetHashCode
ani .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.