Anonymní typy (Visual Basic)
Visual Basic podporuje anonymní typy, které umožňují vytvořit objekty bez psaní definice třída datový typ.Místo toho kompilátor generuje třída pro vás.třída nemá žádný název použitelné, zdědí přímo z Objecta obsahuje vlastnosti určit v deklaraci objekt.Protože není zadán název datový typ , označuje se jako anonymní typ.
Následující příklad deklaruje a vytvoří proměnná product anonymní typ , který má dvě vlastnosti instance Name a Price.
' Variable product is an instance of a simple anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}
A výrazu dotaz kombinovat sloupce dat vybraný dotazpoužívá anonymní typy.Typ výsledek nelze definovat předem, protože sloupce, které mohou vybrat konkrétní dotaz nelze předpovědět.Anonymní typy umožňují vytvořit dotaz vybere libovolný počet sloupců v libovolném pořadí.kompilátor vytvoří datový typ , který odpovídá zadané vlastnosti a v určeném pořadí.
V následujících příkladech products je seznam objektů, produktů, z nichž každá má mnoho vlastností.Proměnná namePriceQuery obsahuje definici dotaz , který při spuštění, vrátí kolekce instancí anonymní typ , který má dvě vlastnosti Name a Price.
Dim namePriceQuery = From prod In products
Select prod.Name, prod.Price
Proměnná nameQuantityQuery obsahuje definici dotaz , který při spuštění, vrátí kolekce instancí anonymní typ , který má dvě vlastnosti Name a OnHand.
Dim nameQuantityQuery = From prod In products
Select prod.Name, prod.OnHand
Další informace o kódu, který vytvořil kompilátor pro anonymní typ, viz Definice autonomního typu (Visual Basic).
Upozornění |
---|
Název anonymní typ je kompilátor generovány a může se lišit od sestavení kompilace.Kód by měl použít nebo spoléhat na název anonymní typ , protože název může změnit, když je provedena nová kompilace projekt . |
Anonymní typ deklarace
Prohlášení o instanci anonymní typ používá k určení vlastnosti typu seznamu k inicializační výraz .Můžete určit vlastnosti pouze při deklarovat anonymní typnení jiné třída prvků jako jsou například metody nebo události.V následujícím příkladu product1 je instancí anonymní typ , který má dvě vlastnosti: Name a Price.
' Variable product1 is an instance of a simple anonymous type.
Dim product1 = New With {.Name = "paperclips", .Price = 1.29}
' -or-
' product2 is an instance of an anonymous type with key properties.
Dim product2 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Pokud určíte vlastnosti jako vlastnosti klíč , můžete je porovnat dvě instance anonymní typ pro rovnost.Hodnoty vlastností klíč však nelze změnit.Dále v tomto tématu Další informace v části vlastnosti klíčů.
Všimněte si, že deklaraci instance anonymní typ je jako deklarování instance pojmenovanou typu pomocí objekt inicializační výraz:
' Variable product3 is an instance of a class named Product.
Dim product3 = New Product With {.Name = "paperclips", .Price = 1.29}
Další informace o jiných způsobech určit vlastnosti anonymní typ , viz Postupy: Odvození názvů a typů vlastností v deklaracích anonymního typu (Visual Basic).
Klíčové vlastnosti
Klíčové vlastnosti se liší od jiných-vlastnostiklíč několika základními způsoby:
Hodnoty vlastností klíč jsou porovnány s cílem určit, zda jsou dvě stejné.
Hodnoty vlastnosti klíč jsou jen pro čtení a nelze je změnit.
Jsou zahrnuty pouze hodnotyvlastnost klíčv kompilátor-generovaný hodnota hashalgoritmus pro anonymní typ.
Rovnost
Instancí anonymních typů může být rovná, pouze pokud jsou instance stejného anonymní typ.kompilátor považovány dvě instance stejného typu, pokud splňují následující podmínky:
Jsou deklarovány ve stejném sestavení.
Jejich vlastnosti mají stejné názvy, stejné typy inferred a jsou deklarovány ve stejném pořadí.Porovnání názvů nejsou rozlišována.
Stejné vlastnosti všech jsou označeny jako vlastnosti klíč .
Nejméně jednu vlastnost každé prohlášení jevlastnost klíč.
Instance anonymních typů, která nemá žádné vlastnosti klíč je rovna pouze sám.
' prod1 and prod2 have no key values.
Dim prod1 = New With {.Name = "paperclips", .Price = 1.29}
Dim prod2 = New With {.Name = "paperclips", .Price = 1.29}
' The following line displays False, because prod1 and prod2 have no
' key properties.
Console.WriteLine(prod1.Equals(prod2))
' The following statement displays True because prod1 is equal to itself.
Console.WriteLine(prod1.Equals(prod1))
Dvě instance stejného anonymní typ se rovná-li shodné hodnoty jejich vlastnosti klíč .Následující příklady znázorňují, jak je testován rovnosti.
Dim prod3 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Dim prod4 = New With {Key .Name = "paperclips", Key .Price = 1.29}
' The following line displays True, because prod3 and prod4 are
' instances of the same anonymous type, and the values of their
' key properties are equal.
Console.WriteLine(prod3.Equals(prod4))
Dim prod5 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Dim prod6 = New With {Key .Name = "paperclips", Key .Price = 1.29,
.OnHand = 423}
' The following line displays False, because prod5 and prod6 do not
' have the same properties.
Console.WriteLine(prod5.Equals(prod6))
Dim prod7 = New With {Key .Name = "paperclips", Key .Price = 1.29,
.OnHand = 24}
Dim prod8 = New With {Key .Name = "paperclips", Key .Price = 1.29,
.OnHand = 423}
' The following line displays True, because prod7 and prod8 are
' instances of the same anonymous type, and the values of their
' key properties are equal. The equality check does not compare the
' values of the non-key field.
Console.WriteLine(prod7.Equals(prod8))
Čtení hodnot
Hodnoty vlastností klíč nelze změnit.Například v prod8 v předchozím příkladu Name a Price pole jsou read-only, ale OnHand lze změnit.
' The following statement will not compile, because Name is a key
' property and its value cannot be changed.
' prod8.Name = "clamps"
' OnHand is not a Key property. Its value can be changed.
prod8.OnHand = 22
Anonymní typy z výrazů v dotazu
Výrazy dotazu vždy nevyžadují vytváření typů anonymní.Pokud možno používají existující typ dat sloupce držet.K tomu dochází, když dotaz vrátí buď celé záznamy z zdroj datnebo pouze jedno pole z každého záznamu.V následujících příkladech kódu customers je kolekce objektů Customer třída. třída má mnoho vlastností a mohou zahrnovat jednu nebo více z nich ve výsledku dotaz v libovolném pořadí.V první dva příklady žádné anonymní typy jsou povinné, protože dotazy vyberte prvky pojmenované typy:
custs1obsahuje kolekce řetězců, protože cust.Name je řetězec.
Dim custs1 = From cust In customers Select cust.Name
custs2obsahuje kolekce Customer objekty, protože každý prvek customers je Customer objekta celý prvek je vybrán v dotaz.
Dim custs2 = From cust In customers Select cust
Však vhodné pojmenované typy nejsou vždy k dispozici.Můžete vybrat zákazník , jména a adresy pro jeden účel, čísla ID zákazník a umístění a zákazník jména, adresy a historie objednávek pro třetí.Anonymní typy umožňují vybrat libovolnou kombinaci vlastností, v libovolném pořadí, bez první deklarování nový typ pojmenovaného držet výsledek.Místo toho kompilátor vytvoří anonymní typ pro každý kompilace vlastnosti.Následující dotaz vybere pouze jméno zákazníka identifikační číslo každého Customer objekt v customers. Proto kompilátor vytvoří anonymní typ , který obsahuje pouze dvě vlastnosti.
Dim custs3 = From cust In customers
Select cust.Name, cust.ID
Názvy a datové typy v anonymní typ vlastnosti jsou převzaty z argumenty Select, cust.Name a cust.ID.Vlastnosti v anonymní typ , který je vytvořen dotaz jsou vždy vlastnosti klíč .Při custs3 je spuštěn v následujících For Each smyčka, výsledek je kolekce instance anonymní typ se dvěma vlastnostmi klíč Name a ID.
For Each selectedCust In custs3
Console.WriteLine(selectedCust.ID & ": " & selectedCust.Name)
Next
Prvky v kolekce reprezentované custs3 důrazně zadali a procházet dostupné vlastnosti a jejich typy ověření pomocí IntelliSense .
Další informace naleznete v tématu Představení technologie LINQ v jazyce Visual Basic.
Rozhodnutí, zda použít anonymní typy
Před vytvořit objekt jako instance anonymní třída, zvažte, zda je to nejlepší možnost.Například pokud chcete vytvořit dočasný objekt obsahující související data a nepotřebujete pro jiné pole a metody, které mohou obsahovat úplnou třída , anonymní typ je dobré řešení.Pokud chcete jiný výběr vlastností každé prohlášení, nebo pokud chcete změnit pořadí vlastností jsou také pohodlný anonymní typy.Pokud projekt zahrnuje několik objektů, které mají stejné vlastnosti v pevném pořadí, můžete však deklarovat jim snadněji pomocíkonstruktor třídapojmenovaný typ. Například s odpovídající konstruktor, je snazší deklarovat několik instancí Product třída než je deklarovat několik instancí anonymní typ.
' Declaring instances of a named type.
Dim firstProd1 As New Product("paperclips", 1.29)
Dim secondProd1 As New Product("desklamp", 28.99)
Dim thirdProd1 As New Product("stapler", 5.09)
' Declaring instances of an anonymous type.
Dim firstProd2 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Dim secondProd2 = New With {Key .Name = "desklamp", Key .Price = 28.99}
Dim thirdProd2 = New With {Key .Name = "stapler", Key .Price = 5.09}
Další výhodou pojmenované typy je, že kompilátor může zachytit náhodnému chybným zadáním názvu vlastnost .V předchozích příkladech firstProd2, secondProd2, a thirdProd2 má být instance stejného anonymní typ.Však byly omylem deklarovat thirdProd2 jedním z následujících způsobů jeho typ se liší od firstProd2 a secondProd2.
' Dim thirdProd2 = New With {Key .Nmae = "stapler", Key .Price = 5.09}
' Dim thirdProd2 = New With {Key .Name = "stapler", Key .Price = "5.09"}
' Dim thirdProd2 = New With {Key .Name = "stapler", .Price = 5.09}
Důležitější jsou omezení použití anonymní typy, které, jak párovat instance pojmenované typy.firstProd2, secondProd2, a thirdProd2 jsou instance stejného anonymní typ.Název sdíleného anonymní typ však není k dispozici a nelze zobrazit, kde se očekává název typu v kódu.Například nelze použít anonymní typ se definovat metoda signatura deklarovat jiné proměnná nebo pole, nebo v jakékoli prohlášení typu.Anonymní typy proto nejsou vhodné, když potřebujete sdílet informace v rámci metody.
Definici anonymní typ
V reakci na prohlášení instanci anonymní typ, kompilátor vytvoří novou definici třída , která obsahuje zadané vlastnosti.
Pokud anonymní typ obsahuje klíčnejméně jednuvlastnost, definice přepíše tři členy zděděné z Object: Equals, GetHashCode, a ToString. Kód vyrobené pro testování rovnosti a stanovení že hodnoty hodnota hash považuje pouze vlastnosti klíč .Pokud obsahuje anonymní typ žádné vlastnosti klíč pouze ToString přepsáno.Nelze explicitně pojmenované vlastnosti anonymní typ konfliktu s těmito metodami generované.Nelze je použít .Equals, .GetHashCode, nebo .ToString název vlastnost.
Anonymní typ definice, které mají alespoň jeden klíčvlastnost také implementovat IEquatable rozhraní, kde T je typ anonymní typ.
Další informace o kódu, který vytvořil kompilátor a funkce potlačené metody Definice autonomního typu (Visual Basic).
Viz také
Úkoly
Postupy: Odvození názvů a typů vlastností v deklaracích anonymního typu (Visual Basic)
Referenční dokumentace
Koncepty
Inicializátory objektů: pojmenované a anonymní typy (Visual Basic)
Odvození místního typu (Visual Basic)